match.pd (swapped_tcc_comparison): New operator list.
[platform/upstream/gcc.git] / gcc / fold-const.c
1 /* Fold a constant sub-tree into a single node for C-compiler
2    Copyright (C) 1987-2015 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 /*@@ This file 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.  */
105 int 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.  */
110 enum 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
129 static bool negate_mathfn_p (enum built_in_function);
130 static bool negate_expr_p (tree);
131 static tree negate_expr (tree);
132 static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
133 static tree associate_trees (location_t, tree, tree, enum tree_code, tree);
134 static enum comparison_code comparison_to_compcode (enum tree_code);
135 static enum tree_code compcode_to_comparison (enum comparison_code);
136 static int operand_equal_for_comparison_p (tree, tree, tree);
137 static int twoval_comparison_p (tree, tree *, tree *, int *);
138 static tree eval_subst (location_t, tree, tree, tree, tree, tree);
139 static tree distribute_bit_expr (location_t, enum tree_code, tree, tree, tree);
140 static tree make_bit_field_ref (location_t, tree, tree,
141                                 HOST_WIDE_INT, HOST_WIDE_INT, int);
142 static tree optimize_bit_field_compare (location_t, enum tree_code,
143                                         tree, tree, tree);
144 static tree decode_field_reference (location_t, tree, HOST_WIDE_INT *,
145                                     HOST_WIDE_INT *,
146                                     machine_mode *, int *, int *,
147                                     tree *, tree *);
148 static int simple_operand_p (const_tree);
149 static bool simple_operand_p_2 (tree);
150 static tree range_binop (enum tree_code, tree, tree, int, tree, int);
151 static tree range_predecessor (tree);
152 static tree range_successor (tree);
153 static tree fold_range_test (location_t, enum tree_code, tree, tree, tree);
154 static tree fold_cond_expr_with_comparison (location_t, tree, tree, tree, tree);
155 static tree unextend (tree, int, int, tree);
156 static tree optimize_minmax_comparison (location_t, enum tree_code,
157                                         tree, tree, tree);
158 static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
159 static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
160 static tree fold_binary_op_with_conditional_arg (location_t,
161                                                  enum tree_code, tree,
162                                                  tree, tree,
163                                                  tree, tree, int);
164 static tree fold_mathfn_compare (location_t,
165                                  enum built_in_function, enum tree_code,
166                                  tree, tree, tree);
167 static tree fold_inf_compare (location_t, enum tree_code, tree, tree, tree);
168 static tree fold_div_compare (location_t, enum tree_code, tree, tree, tree);
169 static bool reorder_operands_p (const_tree, const_tree);
170 static tree fold_negate_const (tree, tree);
171 static tree fold_not_const (const_tree, tree);
172 static tree fold_relational_const (enum tree_code, tree, tree, tree);
173 static tree fold_convert_const (enum tree_code, tree, tree);
174 static tree fold_view_convert_expr (tree, tree);
175 static bool vec_cst_ctor_to_array (tree, tree *);
176
177
178 /* Return EXPR_LOCATION of T if it is not UNKNOWN_LOCATION.
179    Otherwise, return LOC.  */
180
181 static location_t
182 expr_location_or (tree t, location_t loc)
183 {
184   location_t tloc = EXPR_LOCATION (t);
185   return tloc == UNKNOWN_LOCATION ? loc : tloc;
186 }
187
188 /* Similar to protected_set_expr_location, but never modify x in place,
189    if location can and needs to be set, unshare it.  */
190
191 static inline tree
192 protected_set_expr_location_unshare (tree x, location_t loc)
193 {
194   if (CAN_HAVE_LOCATION_P (x)
195       && EXPR_LOCATION (x) != loc
196       && !(TREE_CODE (x) == SAVE_EXPR
197            || TREE_CODE (x) == TARGET_EXPR
198            || TREE_CODE (x) == BIND_EXPR))
199     {
200       x = copy_node (x);
201       SET_EXPR_LOCATION (x, loc);
202     }
203   return x;
204 }
205 \f
206 /* If ARG2 divides ARG1 with zero remainder, carries out the exact
207    division and returns the quotient.  Otherwise returns
208    NULL_TREE.  */
209
210 tree
211 div_if_zero_remainder (const_tree arg1, const_tree arg2)
212 {
213   widest_int quo;
214
215   if (wi::multiple_of_p (wi::to_widest (arg1), wi::to_widest (arg2),
216                          SIGNED, &quo))
217     return wide_int_to_tree (TREE_TYPE (arg1), quo);
218
219   return NULL_TREE; 
220 }
221 \f
222 /* This is nonzero if we should defer warnings about undefined
223    overflow.  This facility exists because these warnings are a
224    special case.  The code to estimate loop iterations does not want
225    to issue any warnings, since it works with expressions which do not
226    occur in user code.  Various bits of cleanup code call fold(), but
227    only use the result if it has certain characteristics (e.g., is a
228    constant); that code only wants to issue a warning if the result is
229    used.  */
230
231 static int fold_deferring_overflow_warnings;
232
233 /* If a warning about undefined overflow is deferred, this is the
234    warning.  Note that this may cause us to turn two warnings into
235    one, but that is fine since it is sufficient to only give one
236    warning per expression.  */
237
238 static const char* fold_deferred_overflow_warning;
239
240 /* If a warning about undefined overflow is deferred, this is the
241    level at which the warning should be emitted.  */
242
243 static enum warn_strict_overflow_code fold_deferred_overflow_code;
244
245 /* Start deferring overflow warnings.  We could use a stack here to
246    permit nested calls, but at present it is not necessary.  */
247
248 void
249 fold_defer_overflow_warnings (void)
250 {
251   ++fold_deferring_overflow_warnings;
252 }
253
254 /* Stop deferring overflow warnings.  If there is a pending warning,
255    and ISSUE is true, then issue the warning if appropriate.  STMT is
256    the statement with which the warning should be associated (used for
257    location information); STMT may be NULL.  CODE is the level of the
258    warning--a warn_strict_overflow_code value.  This function will use
259    the smaller of CODE and the deferred code when deciding whether to
260    issue the warning.  CODE may be zero to mean to always use the
261    deferred code.  */
262
263 void
264 fold_undefer_overflow_warnings (bool issue, const_gimple stmt, int code)
265 {
266   const char *warnmsg;
267   location_t locus;
268
269   gcc_assert (fold_deferring_overflow_warnings > 0);
270   --fold_deferring_overflow_warnings;
271   if (fold_deferring_overflow_warnings > 0)
272     {
273       if (fold_deferred_overflow_warning != NULL
274           && code != 0
275           && code < (int) fold_deferred_overflow_code)
276         fold_deferred_overflow_code = (enum warn_strict_overflow_code) code;
277       return;
278     }
279
280   warnmsg = fold_deferred_overflow_warning;
281   fold_deferred_overflow_warning = NULL;
282
283   if (!issue || warnmsg == NULL)
284     return;
285
286   if (gimple_no_warning_p (stmt))
287     return;
288
289   /* Use the smallest code level when deciding to issue the
290      warning.  */
291   if (code == 0 || code > (int) fold_deferred_overflow_code)
292     code = fold_deferred_overflow_code;
293
294   if (!issue_strict_overflow_warning (code))
295     return;
296
297   if (stmt == NULL)
298     locus = input_location;
299   else
300     locus = gimple_location (stmt);
301   warning_at (locus, OPT_Wstrict_overflow, "%s", warnmsg);
302 }
303
304 /* Stop deferring overflow warnings, ignoring any deferred
305    warnings.  */
306
307 void
308 fold_undefer_and_ignore_overflow_warnings (void)
309 {
310   fold_undefer_overflow_warnings (false, NULL, 0);
311 }
312
313 /* Whether we are deferring overflow warnings.  */
314
315 bool
316 fold_deferring_overflow_warnings_p (void)
317 {
318   return fold_deferring_overflow_warnings > 0;
319 }
320
321 /* This is called when we fold something based on the fact that signed
322    overflow is undefined.  */
323
324 static void
325 fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
326 {
327   if (fold_deferring_overflow_warnings > 0)
328     {
329       if (fold_deferred_overflow_warning == NULL
330           || wc < fold_deferred_overflow_code)
331         {
332           fold_deferred_overflow_warning = gmsgid;
333           fold_deferred_overflow_code = wc;
334         }
335     }
336   else if (issue_strict_overflow_warning (wc))
337     warning (OPT_Wstrict_overflow, gmsgid);
338 }
339 \f
340 /* Return true if the built-in mathematical function specified by CODE
341    is odd, i.e. -f(x) == f(-x).  */
342
343 static bool
344 negate_mathfn_p (enum built_in_function code)
345 {
346   switch (code)
347     {
348     CASE_FLT_FN (BUILT_IN_ASIN):
349     CASE_FLT_FN (BUILT_IN_ASINH):
350     CASE_FLT_FN (BUILT_IN_ATAN):
351     CASE_FLT_FN (BUILT_IN_ATANH):
352     CASE_FLT_FN (BUILT_IN_CASIN):
353     CASE_FLT_FN (BUILT_IN_CASINH):
354     CASE_FLT_FN (BUILT_IN_CATAN):
355     CASE_FLT_FN (BUILT_IN_CATANH):
356     CASE_FLT_FN (BUILT_IN_CBRT):
357     CASE_FLT_FN (BUILT_IN_CPROJ):
358     CASE_FLT_FN (BUILT_IN_CSIN):
359     CASE_FLT_FN (BUILT_IN_CSINH):
360     CASE_FLT_FN (BUILT_IN_CTAN):
361     CASE_FLT_FN (BUILT_IN_CTANH):
362     CASE_FLT_FN (BUILT_IN_ERF):
363     CASE_FLT_FN (BUILT_IN_LLROUND):
364     CASE_FLT_FN (BUILT_IN_LROUND):
365     CASE_FLT_FN (BUILT_IN_ROUND):
366     CASE_FLT_FN (BUILT_IN_SIN):
367     CASE_FLT_FN (BUILT_IN_SINH):
368     CASE_FLT_FN (BUILT_IN_TAN):
369     CASE_FLT_FN (BUILT_IN_TANH):
370     CASE_FLT_FN (BUILT_IN_TRUNC):
371       return true;
372
373     CASE_FLT_FN (BUILT_IN_LLRINT):
374     CASE_FLT_FN (BUILT_IN_LRINT):
375     CASE_FLT_FN (BUILT_IN_NEARBYINT):
376     CASE_FLT_FN (BUILT_IN_RINT):
377       return !flag_rounding_math;
378
379     default:
380       break;
381     }
382   return false;
383 }
384
385 /* Check whether we may negate an integer constant T without causing
386    overflow.  */
387
388 bool
389 may_negate_without_overflow_p (const_tree t)
390 {
391   tree type;
392
393   gcc_assert (TREE_CODE (t) == INTEGER_CST);
394
395   type = TREE_TYPE (t);
396   if (TYPE_UNSIGNED (type))
397     return false;
398
399   return !wi::only_sign_bit_p (t);
400 }
401
402 /* Determine whether an expression T can be cheaply negated using
403    the function negate_expr without introducing undefined overflow.  */
404
405 static bool
406 negate_expr_p (tree t)
407 {
408   tree type;
409
410   if (t == 0)
411     return false;
412
413   type = TREE_TYPE (t);
414
415   STRIP_SIGN_NOPS (t);
416   switch (TREE_CODE (t))
417     {
418     case INTEGER_CST:
419       if (INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_WRAPS (type))
420         return true;
421
422       /* Check that -CST will not overflow type.  */
423       return may_negate_without_overflow_p (t);
424     case BIT_NOT_EXPR:
425       return (INTEGRAL_TYPE_P (type)
426               && TYPE_OVERFLOW_WRAPS (type));
427
428     case FIXED_CST:
429       return true;
430
431     case NEGATE_EXPR:
432       return !TYPE_OVERFLOW_SANITIZED (type);
433
434     case REAL_CST:
435       /* We want to canonicalize to positive real constants.  Pretend
436          that only negative ones can be easily negated.  */
437       return REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
438
439     case COMPLEX_CST:
440       return negate_expr_p (TREE_REALPART (t))
441              && negate_expr_p (TREE_IMAGPART (t));
442
443     case VECTOR_CST:
444       {
445         if (FLOAT_TYPE_P (TREE_TYPE (type)) || TYPE_OVERFLOW_WRAPS (type))
446           return true;
447
448         int count = TYPE_VECTOR_SUBPARTS (type), i;
449
450         for (i = 0; i < count; i++)
451           if (!negate_expr_p (VECTOR_CST_ELT (t, i)))
452             return false;
453
454         return true;
455       }
456
457     case COMPLEX_EXPR:
458       return negate_expr_p (TREE_OPERAND (t, 0))
459              && negate_expr_p (TREE_OPERAND (t, 1));
460
461     case CONJ_EXPR:
462       return negate_expr_p (TREE_OPERAND (t, 0));
463
464     case PLUS_EXPR:
465       if (HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
466           || HONOR_SIGNED_ZEROS (element_mode (type)))
467         return false;
468       /* -(A + B) -> (-B) - A.  */
469       if (negate_expr_p (TREE_OPERAND (t, 1))
470           && reorder_operands_p (TREE_OPERAND (t, 0),
471                                  TREE_OPERAND (t, 1)))
472         return true;
473       /* -(A + B) -> (-A) - B.  */
474       return negate_expr_p (TREE_OPERAND (t, 0));
475
476     case MINUS_EXPR:
477       /* We can't turn -(A-B) into B-A when we honor signed zeros.  */
478       return !HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
479              && !HONOR_SIGNED_ZEROS (element_mode (type))
480              && reorder_operands_p (TREE_OPERAND (t, 0),
481                                     TREE_OPERAND (t, 1));
482
483     case MULT_EXPR:
484       if (TYPE_UNSIGNED (TREE_TYPE (t)))
485         break;
486
487       /* Fall through.  */
488
489     case RDIV_EXPR:
490       if (! HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (TREE_TYPE (t))))
491         return negate_expr_p (TREE_OPERAND (t, 1))
492                || negate_expr_p (TREE_OPERAND (t, 0));
493       break;
494
495     case TRUNC_DIV_EXPR:
496     case ROUND_DIV_EXPR:
497     case EXACT_DIV_EXPR:
498       /* In general we can't negate A / B, because if A is INT_MIN and
499          B is 1, we may turn this into INT_MIN / -1 which is undefined
500          and actually traps on some architectures.  But if overflow is
501          undefined, we can negate, because - (INT_MIN / 1) is an
502          overflow.  */
503       if (INTEGRAL_TYPE_P (TREE_TYPE (t)))
504         {
505           if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
506             break;
507           /* If overflow is undefined then we have to be careful because
508              we ask whether it's ok to associate the negate with the
509              division which is not ok for example for
510              -((a - b) / c) where (-(a - b)) / c may invoke undefined
511              overflow because of negating INT_MIN.  So do not use
512              negate_expr_p here but open-code the two important cases.  */
513           if (TREE_CODE (TREE_OPERAND (t, 0)) == NEGATE_EXPR
514               || (TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST
515                   && may_negate_without_overflow_p (TREE_OPERAND (t, 0))))
516             return true;
517         }
518       else if (negate_expr_p (TREE_OPERAND (t, 0)))
519         return true;
520       return negate_expr_p (TREE_OPERAND (t, 1));
521
522     case NOP_EXPR:
523       /* Negate -((double)float) as (double)(-float).  */
524       if (TREE_CODE (type) == REAL_TYPE)
525         {
526           tree tem = strip_float_extensions (t);
527           if (tem != t)
528             return negate_expr_p (tem);
529         }
530       break;
531
532     case CALL_EXPR:
533       /* Negate -f(x) as f(-x).  */
534       if (negate_mathfn_p (builtin_mathfn_code (t)))
535         return negate_expr_p (CALL_EXPR_ARG (t, 0));
536       break;
537
538     case RSHIFT_EXPR:
539       /* Optimize -((int)x >> 31) into (unsigned)x >> 31 for int.  */
540       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
541         {
542           tree op1 = TREE_OPERAND (t, 1);
543           if (wi::eq_p (op1, TYPE_PRECISION (type) - 1))
544             return true;
545         }
546       break;
547
548     default:
549       break;
550     }
551   return false;
552 }
553
554 /* Given T, an expression, return a folded tree for -T or NULL_TREE, if no
555    simplification is possible.
556    If negate_expr_p would return true for T, NULL_TREE will never be
557    returned.  */
558
559 static tree
560 fold_negate_expr (location_t loc, tree t)
561 {
562   tree type = TREE_TYPE (t);
563   tree tem;
564
565   switch (TREE_CODE (t))
566     {
567     /* Convert - (~A) to A + 1.  */
568     case BIT_NOT_EXPR:
569       if (INTEGRAL_TYPE_P (type))
570         return fold_build2_loc (loc, PLUS_EXPR, type, TREE_OPERAND (t, 0),
571                             build_one_cst (type));
572       break;
573
574     case INTEGER_CST:
575       tem = fold_negate_const (t, type);
576       if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
577           || (ANY_INTEGRAL_TYPE_P (type)
578               && !TYPE_OVERFLOW_TRAPS (type)
579               && TYPE_OVERFLOW_WRAPS (type))
580           || (flag_sanitize & SANITIZE_SI_OVERFLOW) == 0)
581         return tem;
582       break;
583
584     case REAL_CST:
585       tem = fold_negate_const (t, type);
586       return tem;
587
588     case FIXED_CST:
589       tem = fold_negate_const (t, type);
590       return tem;
591
592     case COMPLEX_CST:
593       {
594         tree rpart = fold_negate_expr (loc, TREE_REALPART (t));
595         tree ipart = fold_negate_expr (loc, TREE_IMAGPART (t));
596         if (rpart && ipart)
597           return build_complex (type, rpart, ipart);
598       }
599       break;
600
601     case VECTOR_CST:
602       {
603         int count = TYPE_VECTOR_SUBPARTS (type), i;
604         tree *elts = XALLOCAVEC (tree, count);
605
606         for (i = 0; i < count; i++)
607           {
608             elts[i] = fold_negate_expr (loc, VECTOR_CST_ELT (t, i));
609             if (elts[i] == NULL_TREE)
610               return NULL_TREE;
611           }
612
613         return build_vector (type, elts);
614       }
615
616     case COMPLEX_EXPR:
617       if (negate_expr_p (t))
618         return fold_build2_loc (loc, COMPLEX_EXPR, type,
619                             fold_negate_expr (loc, TREE_OPERAND (t, 0)),
620                             fold_negate_expr (loc, TREE_OPERAND (t, 1)));
621       break;
622
623     case CONJ_EXPR:
624       if (negate_expr_p (t))
625         return fold_build1_loc (loc, CONJ_EXPR, type,
626                             fold_negate_expr (loc, TREE_OPERAND (t, 0)));
627       break;
628
629     case NEGATE_EXPR:
630       if (!TYPE_OVERFLOW_SANITIZED (type))
631         return TREE_OPERAND (t, 0);
632       break;
633
634     case PLUS_EXPR:
635       if (!HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
636           && !HONOR_SIGNED_ZEROS (element_mode (type)))
637         {
638           /* -(A + B) -> (-B) - A.  */
639           if (negate_expr_p (TREE_OPERAND (t, 1))
640               && reorder_operands_p (TREE_OPERAND (t, 0),
641                                      TREE_OPERAND (t, 1)))
642             {
643               tem = negate_expr (TREE_OPERAND (t, 1));
644               return fold_build2_loc (loc, MINUS_EXPR, type,
645                                   tem, TREE_OPERAND (t, 0));
646             }
647
648           /* -(A + B) -> (-A) - B.  */
649           if (negate_expr_p (TREE_OPERAND (t, 0)))
650             {
651               tem = negate_expr (TREE_OPERAND (t, 0));
652               return fold_build2_loc (loc, MINUS_EXPR, type,
653                                   tem, TREE_OPERAND (t, 1));
654             }
655         }
656       break;
657
658     case MINUS_EXPR:
659       /* - (A - B) -> B - A  */
660       if (!HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
661           && !HONOR_SIGNED_ZEROS (element_mode (type))
662           && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)))
663         return fold_build2_loc (loc, MINUS_EXPR, type,
664                             TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
665       break;
666
667     case MULT_EXPR:
668       if (TYPE_UNSIGNED (type))
669         break;
670
671       /* Fall through.  */
672
673     case RDIV_EXPR:
674       if (! HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type)))
675         {
676           tem = TREE_OPERAND (t, 1);
677           if (negate_expr_p (tem))
678             return fold_build2_loc (loc, TREE_CODE (t), type,
679                                 TREE_OPERAND (t, 0), negate_expr (tem));
680           tem = TREE_OPERAND (t, 0);
681           if (negate_expr_p (tem))
682             return fold_build2_loc (loc, TREE_CODE (t), type,
683                                 negate_expr (tem), TREE_OPERAND (t, 1));
684         }
685       break;
686
687     case TRUNC_DIV_EXPR:
688     case ROUND_DIV_EXPR:
689     case EXACT_DIV_EXPR:
690       /* In general we can't negate A / B, because if A is INT_MIN and
691          B is 1, we may turn this into INT_MIN / -1 which is undefined
692          and actually traps on some architectures.  But if overflow is
693          undefined, we can negate, because - (INT_MIN / 1) is an
694          overflow.  */
695       if (!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
696         {
697           const char * const warnmsg = G_("assuming signed overflow does not "
698                                           "occur when negating a division");
699           tem = TREE_OPERAND (t, 1);
700           if (negate_expr_p (tem))
701             {
702               if (INTEGRAL_TYPE_P (type)
703                   && (TREE_CODE (tem) != INTEGER_CST
704                       || integer_onep (tem)))
705                 fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
706               return fold_build2_loc (loc, TREE_CODE (t), type,
707                                   TREE_OPERAND (t, 0), negate_expr (tem));
708             }
709           /* If overflow is undefined then we have to be careful because
710              we ask whether it's ok to associate the negate with the
711              division which is not ok for example for
712              -((a - b) / c) where (-(a - b)) / c may invoke undefined
713              overflow because of negating INT_MIN.  So do not use
714              negate_expr_p here but open-code the two important cases.  */
715           tem = TREE_OPERAND (t, 0);
716           if ((INTEGRAL_TYPE_P (type)
717                && (TREE_CODE (tem) == NEGATE_EXPR
718                    || (TREE_CODE (tem) == INTEGER_CST
719                        && may_negate_without_overflow_p (tem))))
720               || !INTEGRAL_TYPE_P (type))
721             return fold_build2_loc (loc, TREE_CODE (t), type,
722                                     negate_expr (tem), TREE_OPERAND (t, 1));
723         }
724       break;
725
726     case NOP_EXPR:
727       /* Convert -((double)float) into (double)(-float).  */
728       if (TREE_CODE (type) == REAL_TYPE)
729         {
730           tem = strip_float_extensions (t);
731           if (tem != t && negate_expr_p (tem))
732             return fold_convert_loc (loc, type, negate_expr (tem));
733         }
734       break;
735
736     case CALL_EXPR:
737       /* Negate -f(x) as f(-x).  */
738       if (negate_mathfn_p (builtin_mathfn_code (t))
739           && negate_expr_p (CALL_EXPR_ARG (t, 0)))
740         {
741           tree fndecl, arg;
742
743           fndecl = get_callee_fndecl (t);
744           arg = negate_expr (CALL_EXPR_ARG (t, 0));
745           return build_call_expr_loc (loc, fndecl, 1, arg);
746         }
747       break;
748
749     case RSHIFT_EXPR:
750       /* Optimize -((int)x >> 31) into (unsigned)x >> 31 for int.  */
751       if (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
752         {
753           tree op1 = TREE_OPERAND (t, 1);
754           if (wi::eq_p (op1, TYPE_PRECISION (type) - 1))
755             {
756               tree ntype = TYPE_UNSIGNED (type)
757                            ? signed_type_for (type)
758                            : unsigned_type_for (type);
759               tree temp = fold_convert_loc (loc, ntype, TREE_OPERAND (t, 0));
760               temp = fold_build2_loc (loc, RSHIFT_EXPR, ntype, temp, op1);
761               return fold_convert_loc (loc, type, temp);
762             }
763         }
764       break;
765
766     default:
767       break;
768     }
769
770   return NULL_TREE;
771 }
772
773 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
774    negated in a simpler way.  Also allow for T to be NULL_TREE, in which case
775    return NULL_TREE. */
776
777 static tree
778 negate_expr (tree t)
779 {
780   tree type, tem;
781   location_t loc;
782
783   if (t == NULL_TREE)
784     return NULL_TREE;
785
786   loc = EXPR_LOCATION (t);
787   type = TREE_TYPE (t);
788   STRIP_SIGN_NOPS (t);
789
790   tem = fold_negate_expr (loc, t);
791   if (!tem)
792     tem = build1_loc (loc, NEGATE_EXPR, TREE_TYPE (t), t);
793   return fold_convert_loc (loc, type, tem);
794 }
795 \f
796 /* Split a tree IN into a constant, literal and variable parts that could be
797    combined with CODE to make IN.  "constant" means an expression with
798    TREE_CONSTANT but that isn't an actual constant.  CODE must be a
799    commutative arithmetic operation.  Store the constant part into *CONP,
800    the literal in *LITP and return the variable part.  If a part isn't
801    present, set it to null.  If the tree does not decompose in this way,
802    return the entire tree as the variable part and the other parts as null.
803
804    If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR.  In that
805    case, we negate an operand that was subtracted.  Except if it is a
806    literal for which we use *MINUS_LITP instead.
807
808    If NEGATE_P is true, we are negating all of IN, again except a literal
809    for which we use *MINUS_LITP instead.
810
811    If IN is itself a literal or constant, return it as appropriate.
812
813    Note that we do not guarantee that any of the three values will be the
814    same type as IN, but they will have the same signedness and mode.  */
815
816 static tree
817 split_tree (tree in, enum tree_code code, tree *conp, tree *litp,
818             tree *minus_litp, int negate_p)
819 {
820   tree var = 0;
821
822   *conp = 0;
823   *litp = 0;
824   *minus_litp = 0;
825
826   /* Strip any conversions that don't change the machine mode or signedness.  */
827   STRIP_SIGN_NOPS (in);
828
829   if (TREE_CODE (in) == INTEGER_CST || TREE_CODE (in) == REAL_CST
830       || TREE_CODE (in) == FIXED_CST)
831     *litp = in;
832   else if (TREE_CODE (in) == code
833            || ((! FLOAT_TYPE_P (TREE_TYPE (in)) || flag_associative_math)
834                && ! SAT_FIXED_POINT_TYPE_P (TREE_TYPE (in))
835                /* We can associate addition and subtraction together (even
836                   though the C standard doesn't say so) for integers because
837                   the value is not affected.  For reals, the value might be
838                   affected, so we can't.  */
839                && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
840                    || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
841     {
842       tree op0 = TREE_OPERAND (in, 0);
843       tree op1 = TREE_OPERAND (in, 1);
844       int neg1_p = TREE_CODE (in) == MINUS_EXPR;
845       int neg_litp_p = 0, neg_conp_p = 0, neg_var_p = 0;
846
847       /* First see if either of the operands is a literal, then a constant.  */
848       if (TREE_CODE (op0) == INTEGER_CST || TREE_CODE (op0) == REAL_CST
849           || TREE_CODE (op0) == FIXED_CST)
850         *litp = op0, op0 = 0;
851       else if (TREE_CODE (op1) == INTEGER_CST || TREE_CODE (op1) == REAL_CST
852                || TREE_CODE (op1) == FIXED_CST)
853         *litp = op1, neg_litp_p = neg1_p, op1 = 0;
854
855       if (op0 != 0 && TREE_CONSTANT (op0))
856         *conp = op0, op0 = 0;
857       else if (op1 != 0 && TREE_CONSTANT (op1))
858         *conp = op1, neg_conp_p = neg1_p, op1 = 0;
859
860       /* If we haven't dealt with either operand, this is not a case we can
861          decompose.  Otherwise, VAR is either of the ones remaining, if any.  */
862       if (op0 != 0 && op1 != 0)
863         var = in;
864       else if (op0 != 0)
865         var = op0;
866       else
867         var = op1, neg_var_p = neg1_p;
868
869       /* Now do any needed negations.  */
870       if (neg_litp_p)
871         *minus_litp = *litp, *litp = 0;
872       if (neg_conp_p)
873         *conp = negate_expr (*conp);
874       if (neg_var_p)
875         var = negate_expr (var);
876     }
877   else if (TREE_CODE (in) == BIT_NOT_EXPR
878            && code == PLUS_EXPR)
879     {
880       /* -X - 1 is folded to ~X, undo that here.  */
881       *minus_litp = build_one_cst (TREE_TYPE (in));
882       var = negate_expr (TREE_OPERAND (in, 0));
883     }
884   else if (TREE_CONSTANT (in))
885     *conp = in;
886   else
887     var = in;
888
889   if (negate_p)
890     {
891       if (*litp)
892         *minus_litp = *litp, *litp = 0;
893       else if (*minus_litp)
894         *litp = *minus_litp, *minus_litp = 0;
895       *conp = negate_expr (*conp);
896       var = negate_expr (var);
897     }
898
899   return var;
900 }
901
902 /* Re-associate trees split by the above function.  T1 and T2 are
903    either expressions to associate or null.  Return the new
904    expression, if any.  LOC is the location of the new expression.  If
905    we build an operation, do it in TYPE and with CODE.  */
906
907 static tree
908 associate_trees (location_t loc, tree t1, tree t2, enum tree_code code, tree type)
909 {
910   if (t1 == 0)
911     return t2;
912   else if (t2 == 0)
913     return t1;
914
915   /* If either input is CODE, a PLUS_EXPR, or a MINUS_EXPR, don't
916      try to fold this since we will have infinite recursion.  But do
917      deal with any NEGATE_EXPRs.  */
918   if (TREE_CODE (t1) == code || TREE_CODE (t2) == code
919       || TREE_CODE (t1) == MINUS_EXPR || TREE_CODE (t2) == MINUS_EXPR)
920     {
921       if (code == PLUS_EXPR)
922         {
923           if (TREE_CODE (t1) == NEGATE_EXPR)
924             return build2_loc (loc, MINUS_EXPR, type,
925                                fold_convert_loc (loc, type, t2),
926                                fold_convert_loc (loc, type,
927                                                  TREE_OPERAND (t1, 0)));
928           else if (TREE_CODE (t2) == NEGATE_EXPR)
929             return build2_loc (loc, MINUS_EXPR, type,
930                                fold_convert_loc (loc, type, t1),
931                                fold_convert_loc (loc, type,
932                                                  TREE_OPERAND (t2, 0)));
933           else if (integer_zerop (t2))
934             return fold_convert_loc (loc, type, t1);
935         }
936       else if (code == MINUS_EXPR)
937         {
938           if (integer_zerop (t2))
939             return fold_convert_loc (loc, type, t1);
940         }
941
942       return build2_loc (loc, code, type, fold_convert_loc (loc, type, t1),
943                          fold_convert_loc (loc, type, t2));
944     }
945
946   return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, t1),
947                           fold_convert_loc (loc, type, t2));
948 }
949 \f
950 /* Check whether TYPE1 and TYPE2 are equivalent integer types, suitable
951    for use in int_const_binop, size_binop and size_diffop.  */
952
953 static bool
954 int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2)
955 {
956   if (!INTEGRAL_TYPE_P (type1) && !POINTER_TYPE_P (type1))
957     return false;
958   if (!INTEGRAL_TYPE_P (type2) && !POINTER_TYPE_P (type2))
959     return false;
960
961   switch (code)
962     {
963     case LSHIFT_EXPR:
964     case RSHIFT_EXPR:
965     case LROTATE_EXPR:
966     case RROTATE_EXPR:
967       return true;
968
969     default:
970       break;
971     }
972
973   return TYPE_UNSIGNED (type1) == TYPE_UNSIGNED (type2)
974          && TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
975          && TYPE_MODE (type1) == TYPE_MODE (type2);
976 }
977
978
979 /* Combine two integer constants ARG1 and ARG2 under operation CODE
980    to produce a new constant.  Return NULL_TREE if we don't know how
981    to evaluate CODE at compile-time.  */
982
983 static tree
984 int_const_binop_1 (enum tree_code code, const_tree arg1, const_tree parg2,
985                    int overflowable)
986 {
987   wide_int res;
988   tree t;
989   tree type = TREE_TYPE (arg1);
990   signop sign = TYPE_SIGN (type);
991   bool overflow = false;
992
993   wide_int arg2 = wide_int::from (parg2, TYPE_PRECISION (type),
994                                   TYPE_SIGN (TREE_TYPE (parg2)));
995
996   switch (code)
997     {
998     case BIT_IOR_EXPR:
999       res = wi::bit_or (arg1, arg2);
1000       break;
1001
1002     case BIT_XOR_EXPR:
1003       res = wi::bit_xor (arg1, arg2);
1004       break;
1005
1006     case BIT_AND_EXPR:
1007       res = wi::bit_and (arg1, arg2);
1008       break;
1009
1010     case RSHIFT_EXPR:
1011     case LSHIFT_EXPR:
1012       if (wi::neg_p (arg2))
1013         {
1014           arg2 = -arg2;
1015           if (code == RSHIFT_EXPR)
1016             code = LSHIFT_EXPR;
1017           else
1018             code = RSHIFT_EXPR;
1019         }
1020
1021       if (code == RSHIFT_EXPR)
1022         /* It's unclear from the C standard whether shifts can overflow.
1023            The following code ignores overflow; perhaps a C standard
1024            interpretation ruling is needed.  */
1025         res = wi::rshift (arg1, arg2, sign);
1026       else
1027         res = wi::lshift (arg1, arg2);
1028       break;
1029
1030     case RROTATE_EXPR:
1031     case LROTATE_EXPR:
1032       if (wi::neg_p (arg2))
1033         {
1034           arg2 = -arg2;
1035           if (code == RROTATE_EXPR)
1036             code = LROTATE_EXPR;
1037           else
1038             code = RROTATE_EXPR;
1039         }
1040
1041       if (code == RROTATE_EXPR)
1042         res = wi::rrotate (arg1, arg2);
1043       else
1044         res = wi::lrotate (arg1, arg2);
1045       break;
1046
1047     case PLUS_EXPR:
1048       res = wi::add (arg1, arg2, sign, &overflow);
1049       break;
1050
1051     case MINUS_EXPR:
1052       res = wi::sub (arg1, arg2, sign, &overflow);
1053       break;
1054
1055     case MULT_EXPR:
1056       res = wi::mul (arg1, arg2, sign, &overflow);
1057       break;
1058
1059     case MULT_HIGHPART_EXPR:
1060       res = wi::mul_high (arg1, arg2, sign);
1061       break;
1062
1063     case TRUNC_DIV_EXPR:
1064     case EXACT_DIV_EXPR:
1065       if (arg2 == 0)
1066         return NULL_TREE;
1067       res = wi::div_trunc (arg1, arg2, sign, &overflow);
1068       break;
1069
1070     case FLOOR_DIV_EXPR:
1071       if (arg2 == 0)
1072         return NULL_TREE;
1073       res = wi::div_floor (arg1, arg2, sign, &overflow);
1074       break;
1075
1076     case CEIL_DIV_EXPR:
1077       if (arg2 == 0)
1078         return NULL_TREE;
1079       res = wi::div_ceil (arg1, arg2, sign, &overflow);
1080       break;
1081
1082     case ROUND_DIV_EXPR:
1083       if (arg2 == 0)
1084         return NULL_TREE;
1085       res = wi::div_round (arg1, arg2, sign, &overflow);
1086       break;
1087
1088     case TRUNC_MOD_EXPR:
1089       if (arg2 == 0)
1090         return NULL_TREE;
1091       res = wi::mod_trunc (arg1, arg2, sign, &overflow);
1092       break;
1093
1094     case FLOOR_MOD_EXPR:
1095       if (arg2 == 0)
1096         return NULL_TREE;
1097       res = wi::mod_floor (arg1, arg2, sign, &overflow);
1098       break;
1099
1100     case CEIL_MOD_EXPR:
1101       if (arg2 == 0)
1102         return NULL_TREE;
1103       res = wi::mod_ceil (arg1, arg2, sign, &overflow);
1104       break;
1105
1106     case ROUND_MOD_EXPR:
1107       if (arg2 == 0)
1108         return NULL_TREE;
1109       res = wi::mod_round (arg1, arg2, sign, &overflow);
1110       break;
1111
1112     case MIN_EXPR:
1113       res = wi::min (arg1, arg2, sign);
1114       break;
1115
1116     case MAX_EXPR:
1117       res = wi::max (arg1, arg2, sign);
1118       break;
1119
1120     default:
1121       return NULL_TREE;
1122     }
1123
1124   t = force_fit_type (type, res, overflowable,
1125                       (((sign == SIGNED || overflowable == -1)
1126                         && overflow)
1127                        | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (parg2)));
1128
1129   return t;
1130 }
1131
1132 tree
1133 int_const_binop (enum tree_code code, const_tree arg1, const_tree arg2)
1134 {
1135   return int_const_binop_1 (code, arg1, arg2, 1);
1136 }
1137
1138 /* Combine two constants ARG1 and ARG2 under operation CODE to produce a new
1139    constant.  We assume ARG1 and ARG2 have the same data type, or at least
1140    are the same kind of constant and the same machine mode.  Return zero if
1141    combining the constants is not allowed in the current operating mode.  */
1142
1143 static tree
1144 const_binop (enum tree_code code, tree arg1, tree arg2)
1145 {
1146   /* Sanity check for the recursive cases.  */
1147   if (!arg1 || !arg2)
1148     return NULL_TREE;
1149
1150   STRIP_NOPS (arg1);
1151   STRIP_NOPS (arg2);
1152
1153   if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg2) == INTEGER_CST)
1154     {
1155       if (code == POINTER_PLUS_EXPR)
1156         return int_const_binop (PLUS_EXPR,
1157                                 arg1, fold_convert (TREE_TYPE (arg1), arg2));
1158
1159       return int_const_binop (code, arg1, arg2);
1160     }
1161
1162   if (TREE_CODE (arg1) == REAL_CST && TREE_CODE (arg2) == REAL_CST)
1163     {
1164       machine_mode mode;
1165       REAL_VALUE_TYPE d1;
1166       REAL_VALUE_TYPE d2;
1167       REAL_VALUE_TYPE value;
1168       REAL_VALUE_TYPE result;
1169       bool inexact;
1170       tree t, type;
1171
1172       /* The following codes are handled by real_arithmetic.  */
1173       switch (code)
1174         {
1175         case PLUS_EXPR:
1176         case MINUS_EXPR:
1177         case MULT_EXPR:
1178         case RDIV_EXPR:
1179         case MIN_EXPR:
1180         case MAX_EXPR:
1181           break;
1182
1183         default:
1184           return NULL_TREE;
1185         }
1186
1187       d1 = TREE_REAL_CST (arg1);
1188       d2 = TREE_REAL_CST (arg2);
1189
1190       type = TREE_TYPE (arg1);
1191       mode = TYPE_MODE (type);
1192
1193       /* Don't perform operation if we honor signaling NaNs and
1194          either operand is a NaN.  */
1195       if (HONOR_SNANS (mode)
1196           && (REAL_VALUE_ISNAN (d1) || REAL_VALUE_ISNAN (d2)))
1197         return NULL_TREE;
1198
1199       /* Don't perform operation if it would raise a division
1200          by zero exception.  */
1201       if (code == RDIV_EXPR
1202           && REAL_VALUES_EQUAL (d2, dconst0)
1203           && (flag_trapping_math || ! MODE_HAS_INFINITIES (mode)))
1204         return NULL_TREE;
1205
1206       /* If either operand is a NaN, just return it.  Otherwise, set up
1207          for floating-point trap; we return an overflow.  */
1208       if (REAL_VALUE_ISNAN (d1))
1209         return arg1;
1210       else if (REAL_VALUE_ISNAN (d2))
1211         return arg2;
1212
1213       inexact = real_arithmetic (&value, code, &d1, &d2);
1214       real_convert (&result, mode, &value);
1215
1216       /* Don't constant fold this floating point operation if
1217          the result has overflowed and flag_trapping_math.  */
1218       if (flag_trapping_math
1219           && MODE_HAS_INFINITIES (mode)
1220           && REAL_VALUE_ISINF (result)
1221           && !REAL_VALUE_ISINF (d1)
1222           && !REAL_VALUE_ISINF (d2))
1223         return NULL_TREE;
1224
1225       /* Don't constant fold this floating point operation if the
1226          result may dependent upon the run-time rounding mode and
1227          flag_rounding_math is set, or if GCC's software emulation
1228          is unable to accurately represent the result.  */
1229       if ((flag_rounding_math
1230            || (MODE_COMPOSITE_P (mode) && !flag_unsafe_math_optimizations))
1231           && (inexact || !real_identical (&result, &value)))
1232         return NULL_TREE;
1233
1234       t = build_real (type, result);
1235
1236       TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2);
1237       return t;
1238     }
1239
1240   if (TREE_CODE (arg1) == FIXED_CST)
1241     {
1242       FIXED_VALUE_TYPE f1;
1243       FIXED_VALUE_TYPE f2;
1244       FIXED_VALUE_TYPE result;
1245       tree t, type;
1246       int sat_p;
1247       bool overflow_p;
1248
1249       /* The following codes are handled by fixed_arithmetic.  */
1250       switch (code)
1251         {
1252         case PLUS_EXPR:
1253         case MINUS_EXPR:
1254         case MULT_EXPR:
1255         case TRUNC_DIV_EXPR:
1256           if (TREE_CODE (arg2) != FIXED_CST)
1257             return NULL_TREE;
1258           f2 = TREE_FIXED_CST (arg2);
1259           break;
1260
1261         case LSHIFT_EXPR:
1262         case RSHIFT_EXPR:
1263           {
1264             if (TREE_CODE (arg2) != INTEGER_CST)
1265               return NULL_TREE;
1266             wide_int w2 = arg2;
1267             f2.data.high = w2.elt (1);
1268             f2.data.low = w2.elt (0);
1269             f2.mode = SImode;
1270           }
1271           break;
1272
1273         default:
1274           return NULL_TREE;
1275         }
1276
1277       f1 = TREE_FIXED_CST (arg1);
1278       type = TREE_TYPE (arg1);
1279       sat_p = TYPE_SATURATING (type);
1280       overflow_p = fixed_arithmetic (&result, code, &f1, &f2, sat_p);
1281       t = build_fixed (type, result);
1282       /* Propagate overflow flags.  */
1283       if (overflow_p | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2))
1284         TREE_OVERFLOW (t) = 1;
1285       return t;
1286     }
1287
1288   if (TREE_CODE (arg1) == COMPLEX_CST && TREE_CODE (arg2) == COMPLEX_CST)
1289     {
1290       tree type = TREE_TYPE (arg1);
1291       tree r1 = TREE_REALPART (arg1);
1292       tree i1 = TREE_IMAGPART (arg1);
1293       tree r2 = TREE_REALPART (arg2);
1294       tree i2 = TREE_IMAGPART (arg2);
1295       tree real, imag;
1296
1297       switch (code)
1298         {
1299         case PLUS_EXPR:
1300         case MINUS_EXPR:
1301           real = const_binop (code, r1, r2);
1302           imag = const_binop (code, i1, i2);
1303           break;
1304
1305         case MULT_EXPR:
1306           if (COMPLEX_FLOAT_TYPE_P (type))
1307             return do_mpc_arg2 (arg1, arg2, type,
1308                                 /* do_nonfinite= */ folding_initializer,
1309                                 mpc_mul);
1310
1311           real = const_binop (MINUS_EXPR,
1312                               const_binop (MULT_EXPR, r1, r2),
1313                               const_binop (MULT_EXPR, i1, i2));
1314           imag = const_binop (PLUS_EXPR,
1315                               const_binop (MULT_EXPR, r1, i2),
1316                               const_binop (MULT_EXPR, i1, r2));
1317           break;
1318
1319         case RDIV_EXPR:
1320           if (COMPLEX_FLOAT_TYPE_P (type))
1321             return do_mpc_arg2 (arg1, arg2, type,
1322                                 /* do_nonfinite= */ folding_initializer,
1323                                 mpc_div);
1324           /* Fallthru ... */
1325         case TRUNC_DIV_EXPR:
1326         case CEIL_DIV_EXPR:
1327         case FLOOR_DIV_EXPR:
1328         case ROUND_DIV_EXPR:
1329           if (flag_complex_method == 0)
1330           {
1331             /* Keep this algorithm in sync with
1332                tree-complex.c:expand_complex_div_straight().
1333
1334                Expand complex division to scalars, straightforward algorithm.
1335                a / b = ((ar*br + ai*bi)/t) + i((ai*br - ar*bi)/t)
1336                t = br*br + bi*bi
1337             */
1338             tree magsquared
1339               = const_binop (PLUS_EXPR,
1340                              const_binop (MULT_EXPR, r2, r2),
1341                              const_binop (MULT_EXPR, i2, i2));
1342             tree t1
1343               = const_binop (PLUS_EXPR,
1344                              const_binop (MULT_EXPR, r1, r2),
1345                              const_binop (MULT_EXPR, i1, i2));
1346             tree t2
1347               = const_binop (MINUS_EXPR,
1348                              const_binop (MULT_EXPR, i1, r2),
1349                              const_binop (MULT_EXPR, r1, i2));
1350
1351             real = const_binop (code, t1, magsquared);
1352             imag = const_binop (code, t2, magsquared);
1353           }
1354           else
1355           {
1356             /* Keep this algorithm in sync with
1357                tree-complex.c:expand_complex_div_wide().
1358
1359                Expand complex division to scalars, modified algorithm to minimize
1360                overflow with wide input ranges.  */
1361             tree compare = fold_build2 (LT_EXPR, boolean_type_node,
1362                                         fold_abs_const (r2, TREE_TYPE (type)),
1363                                         fold_abs_const (i2, TREE_TYPE (type)));
1364
1365             if (integer_nonzerop (compare))
1366               {
1367                 /* In the TRUE branch, we compute
1368                    ratio = br/bi;
1369                    div = (br * ratio) + bi;
1370                    tr = (ar * ratio) + ai;
1371                    ti = (ai * ratio) - ar;
1372                    tr = tr / div;
1373                    ti = ti / div;  */
1374                 tree ratio = const_binop (code, r2, i2);
1375                 tree div = const_binop (PLUS_EXPR, i2,
1376                                         const_binop (MULT_EXPR, r2, ratio));
1377                 real = const_binop (MULT_EXPR, r1, ratio);
1378                 real = const_binop (PLUS_EXPR, real, i1);
1379                 real = const_binop (code, real, div);
1380
1381                 imag = const_binop (MULT_EXPR, i1, ratio);
1382                 imag = const_binop (MINUS_EXPR, imag, r1);
1383                 imag = const_binop (code, imag, div);
1384               }
1385             else
1386               {
1387                 /* In the FALSE branch, we compute
1388                    ratio = d/c;
1389                    divisor = (d * ratio) + c;
1390                    tr = (b * ratio) + a;
1391                    ti = b - (a * ratio);
1392                    tr = tr / div;
1393                    ti = ti / div;  */
1394                 tree ratio = const_binop (code, i2, r2);
1395                 tree div = const_binop (PLUS_EXPR, r2,
1396                                         const_binop (MULT_EXPR, i2, ratio));
1397
1398                 real = const_binop (MULT_EXPR, i1, ratio);
1399                 real = const_binop (PLUS_EXPR, real, r1);
1400                 real = const_binop (code, real, div);
1401
1402                 imag = const_binop (MULT_EXPR, r1, ratio);
1403                 imag = const_binop (MINUS_EXPR, i1, imag);
1404                 imag = const_binop (code, imag, div);
1405               }
1406           }
1407           break;
1408
1409         default:
1410           return NULL_TREE;
1411         }
1412
1413       if (real && imag)
1414         return build_complex (type, real, imag);
1415     }
1416
1417   if (TREE_CODE (arg1) == VECTOR_CST
1418       && TREE_CODE (arg2) == VECTOR_CST)
1419     {
1420       tree type = TREE_TYPE (arg1);
1421       int count = TYPE_VECTOR_SUBPARTS (type), i;
1422       tree *elts = XALLOCAVEC (tree, count);
1423
1424       for (i = 0; i < count; i++)
1425         {
1426           tree elem1 = VECTOR_CST_ELT (arg1, i);
1427           tree elem2 = VECTOR_CST_ELT (arg2, i);
1428
1429           elts[i] = const_binop (code, elem1, elem2);
1430
1431           /* It is possible that const_binop cannot handle the given
1432              code and return NULL_TREE */
1433           if (elts[i] == NULL_TREE)
1434             return NULL_TREE;
1435         }
1436
1437       return build_vector (type, elts);
1438     }
1439
1440   /* Shifts allow a scalar offset for a vector.  */
1441   if (TREE_CODE (arg1) == VECTOR_CST
1442       && TREE_CODE (arg2) == INTEGER_CST)
1443     {
1444       tree type = TREE_TYPE (arg1);
1445       int count = TYPE_VECTOR_SUBPARTS (type), i;
1446       tree *elts = XALLOCAVEC (tree, count);
1447
1448       for (i = 0; i < count; i++)
1449         {
1450           tree elem1 = VECTOR_CST_ELT (arg1, i);
1451
1452           elts[i] = const_binop (code, elem1, arg2);
1453
1454           /* It is possible that const_binop cannot handle the given
1455              code and return NULL_TREE.  */
1456           if (elts[i] == NULL_TREE)
1457             return NULL_TREE;
1458         }
1459
1460       return build_vector (type, elts);
1461     }
1462   return NULL_TREE;
1463 }
1464
1465 /* Overload that adds a TYPE parameter to be able to dispatch
1466    to fold_relational_const.  */
1467
1468 tree
1469 const_binop (enum tree_code code, tree type, tree arg1, tree arg2)
1470 {
1471   if (TREE_CODE_CLASS (code) == tcc_comparison)
1472     return fold_relational_const (code, type, arg1, arg2);
1473
1474   /* ???  Until we make the const_binop worker take the type of the
1475      result as argument put those cases that need it here.  */
1476   switch (code)
1477     {
1478     case COMPLEX_EXPR:
1479       if ((TREE_CODE (arg1) == REAL_CST
1480            && TREE_CODE (arg2) == REAL_CST)
1481           || (TREE_CODE (arg1) == INTEGER_CST
1482               && TREE_CODE (arg2) == INTEGER_CST))
1483         return build_complex (type, arg1, arg2);
1484       return NULL_TREE;
1485
1486     case VEC_PACK_TRUNC_EXPR:
1487     case VEC_PACK_FIX_TRUNC_EXPR:
1488       {
1489         unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
1490         tree *elts;
1491
1492         gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)) == nelts / 2
1493                     && TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg2)) == nelts / 2);
1494         if (TREE_CODE (arg1) != VECTOR_CST
1495             || TREE_CODE (arg2) != VECTOR_CST)
1496           return NULL_TREE;
1497
1498         elts = XALLOCAVEC (tree, nelts);
1499         if (!vec_cst_ctor_to_array (arg1, elts)
1500             || !vec_cst_ctor_to_array (arg2, elts + nelts / 2))
1501           return NULL_TREE;
1502
1503         for (i = 0; i < nelts; i++)
1504           {
1505             elts[i] = fold_convert_const (code == VEC_PACK_TRUNC_EXPR
1506                                           ? NOP_EXPR : FIX_TRUNC_EXPR,
1507                                           TREE_TYPE (type), elts[i]);
1508             if (elts[i] == NULL_TREE || !CONSTANT_CLASS_P (elts[i]))
1509               return NULL_TREE;
1510           }
1511
1512         return build_vector (type, elts);
1513       }
1514
1515     case VEC_WIDEN_MULT_LO_EXPR:
1516     case VEC_WIDEN_MULT_HI_EXPR:
1517     case VEC_WIDEN_MULT_EVEN_EXPR:
1518     case VEC_WIDEN_MULT_ODD_EXPR:
1519       {
1520         unsigned int nelts = TYPE_VECTOR_SUBPARTS (type);
1521         unsigned int out, ofs, scale;
1522         tree *elts;
1523
1524         gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)) == nelts * 2
1525                     && TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg2)) == nelts * 2);
1526         if (TREE_CODE (arg1) != VECTOR_CST || TREE_CODE (arg2) != VECTOR_CST)
1527           return NULL_TREE;
1528
1529         elts = XALLOCAVEC (tree, nelts * 4);
1530         if (!vec_cst_ctor_to_array (arg1, elts)
1531             || !vec_cst_ctor_to_array (arg2, elts + nelts * 2))
1532           return NULL_TREE;
1533
1534         if (code == VEC_WIDEN_MULT_LO_EXPR)
1535           scale = 0, ofs = BYTES_BIG_ENDIAN ? nelts : 0;
1536         else if (code == VEC_WIDEN_MULT_HI_EXPR)
1537           scale = 0, ofs = BYTES_BIG_ENDIAN ? 0 : nelts;
1538         else if (code == VEC_WIDEN_MULT_EVEN_EXPR)
1539           scale = 1, ofs = 0;
1540         else /* if (code == VEC_WIDEN_MULT_ODD_EXPR) */
1541           scale = 1, ofs = 1;
1542
1543         for (out = 0; out < nelts; out++)
1544           {
1545             unsigned int in1 = (out << scale) + ofs;
1546             unsigned int in2 = in1 + nelts * 2;
1547             tree t1, t2;
1548
1549             t1 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), elts[in1]);
1550             t2 = fold_convert_const (NOP_EXPR, TREE_TYPE (type), elts[in2]);
1551
1552             if (t1 == NULL_TREE || t2 == NULL_TREE)
1553               return NULL_TREE;
1554             elts[out] = const_binop (MULT_EXPR, t1, t2);
1555             if (elts[out] == NULL_TREE || !CONSTANT_CLASS_P (elts[out]))
1556               return NULL_TREE;
1557           }
1558
1559         return build_vector (type, elts);
1560       }
1561
1562     default:;
1563     }
1564
1565   if (TREE_CODE_CLASS (code) != tcc_binary)
1566     return NULL_TREE;
1567
1568   /* Make sure type and arg0 have the same saturating flag.  */
1569   gcc_checking_assert (TYPE_SATURATING (type)
1570                        == TYPE_SATURATING (TREE_TYPE (arg1)));
1571
1572   return const_binop (code, arg1, arg2);
1573 }
1574
1575 /* Compute CODE ARG1 with resulting type TYPE with ARG1 being constant.
1576    Return zero if computing the constants is not possible.  */
1577
1578 tree
1579 const_unop (enum tree_code code, tree type, tree arg0)
1580 {
1581   switch (code)
1582     {
1583     CASE_CONVERT:
1584     case FLOAT_EXPR:
1585     case FIX_TRUNC_EXPR:
1586     case FIXED_CONVERT_EXPR:
1587       return fold_convert_const (code, type, arg0);
1588
1589     case ADDR_SPACE_CONVERT_EXPR:
1590       if (integer_zerop (arg0))
1591         return fold_convert_const (code, type, arg0);
1592       break;
1593
1594     case VIEW_CONVERT_EXPR:
1595       return fold_view_convert_expr (type, arg0);
1596
1597     case NEGATE_EXPR:
1598       {
1599         /* Can't call fold_negate_const directly here as that doesn't
1600            handle all cases and we might not be able to negate some
1601            constants.  */
1602         tree tem = fold_negate_expr (UNKNOWN_LOCATION, arg0);
1603         if (tem && CONSTANT_CLASS_P (tem))
1604           return tem;
1605         break;
1606       }
1607
1608     case ABS_EXPR:
1609       if (TREE_CODE (arg0) == INTEGER_CST || TREE_CODE (arg0) == REAL_CST)
1610         return fold_abs_const (arg0, type);
1611       break;
1612
1613     case CONJ_EXPR:
1614       if (TREE_CODE (arg0) == COMPLEX_CST)
1615         {
1616           tree ipart = fold_negate_const (TREE_IMAGPART (arg0),
1617                                           TREE_TYPE (type));
1618           return build_complex (type, TREE_REALPART (arg0), ipart);
1619         }
1620       break;
1621
1622     case BIT_NOT_EXPR:
1623       if (TREE_CODE (arg0) == INTEGER_CST)
1624         return fold_not_const (arg0, type);
1625       /* Perform BIT_NOT_EXPR on each element individually.  */
1626       else if (TREE_CODE (arg0) == VECTOR_CST)
1627         {
1628           tree *elements;
1629           tree elem;
1630           unsigned count = VECTOR_CST_NELTS (arg0), i;
1631
1632           elements = XALLOCAVEC (tree, count);
1633           for (i = 0; i < count; i++)
1634             {
1635               elem = VECTOR_CST_ELT (arg0, i);
1636               elem = const_unop (BIT_NOT_EXPR, TREE_TYPE (type), elem);
1637               if (elem == NULL_TREE)
1638                 break;
1639               elements[i] = elem;
1640             }
1641           if (i == count)
1642             return build_vector (type, elements);
1643         }
1644       break;
1645
1646     case TRUTH_NOT_EXPR:
1647       if (TREE_CODE (arg0) == INTEGER_CST)
1648         return constant_boolean_node (integer_zerop (arg0), type);
1649       break;
1650
1651     case REALPART_EXPR:
1652       if (TREE_CODE (arg0) == COMPLEX_CST)
1653         return fold_convert (type, TREE_REALPART (arg0));
1654       break;
1655
1656     case IMAGPART_EXPR:
1657       if (TREE_CODE (arg0) == COMPLEX_CST)
1658         return fold_convert (type, TREE_IMAGPART (arg0));
1659       break;
1660
1661     case VEC_UNPACK_LO_EXPR:
1662     case VEC_UNPACK_HI_EXPR:
1663     case VEC_UNPACK_FLOAT_LO_EXPR:
1664     case VEC_UNPACK_FLOAT_HI_EXPR:
1665       {
1666         unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
1667         tree *elts;
1668         enum tree_code subcode;
1669
1670         gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts * 2);
1671         if (TREE_CODE (arg0) != VECTOR_CST)
1672           return NULL_TREE;
1673
1674         elts = XALLOCAVEC (tree, nelts * 2);
1675         if (!vec_cst_ctor_to_array (arg0, elts))
1676           return NULL_TREE;
1677
1678         if ((!BYTES_BIG_ENDIAN) ^ (code == VEC_UNPACK_LO_EXPR
1679                                    || code == VEC_UNPACK_FLOAT_LO_EXPR))
1680           elts += nelts;
1681
1682         if (code == VEC_UNPACK_LO_EXPR || code == VEC_UNPACK_HI_EXPR)
1683           subcode = NOP_EXPR;
1684         else
1685           subcode = FLOAT_EXPR;
1686
1687         for (i = 0; i < nelts; i++)
1688           {
1689             elts[i] = fold_convert_const (subcode, TREE_TYPE (type), elts[i]);
1690             if (elts[i] == NULL_TREE || !CONSTANT_CLASS_P (elts[i]))
1691               return NULL_TREE;
1692           }
1693
1694         return build_vector (type, elts);
1695       }
1696
1697     case REDUC_MIN_EXPR:
1698     case REDUC_MAX_EXPR:
1699     case REDUC_PLUS_EXPR:
1700       {
1701         unsigned int nelts, i;
1702         tree *elts;
1703         enum tree_code subcode;
1704
1705         if (TREE_CODE (arg0) != VECTOR_CST)
1706           return NULL_TREE;
1707         nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0));
1708
1709         elts = XALLOCAVEC (tree, nelts);
1710         if (!vec_cst_ctor_to_array (arg0, elts))
1711           return NULL_TREE;
1712
1713         switch (code)
1714           {
1715           case REDUC_MIN_EXPR: subcode = MIN_EXPR; break;
1716           case REDUC_MAX_EXPR: subcode = MAX_EXPR; break;
1717           case REDUC_PLUS_EXPR: subcode = PLUS_EXPR; break;
1718           default: gcc_unreachable ();
1719           }
1720
1721         for (i = 1; i < nelts; i++)
1722           {
1723             elts[0] = const_binop (subcode, elts[0], elts[i]);
1724             if (elts[0] == NULL_TREE || !CONSTANT_CLASS_P (elts[0]))
1725               return NULL_TREE;
1726           }
1727
1728         return elts[0];
1729       }
1730
1731     default:
1732       break;
1733     }
1734
1735   return NULL_TREE;
1736 }
1737
1738 /* Create a sizetype INT_CST node with NUMBER sign extended.  KIND
1739    indicates which particular sizetype to create.  */
1740
1741 tree
1742 size_int_kind (HOST_WIDE_INT number, enum size_type_kind kind)
1743 {
1744   return build_int_cst (sizetype_tab[(int) kind], number);
1745 }
1746 \f
1747 /* Combine operands OP1 and OP2 with arithmetic operation CODE.  CODE
1748    is a tree code.  The type of the result is taken from the operands.
1749    Both must be equivalent integer types, ala int_binop_types_match_p.
1750    If the operands are constant, so is the result.  */
1751
1752 tree
1753 size_binop_loc (location_t loc, enum tree_code code, tree arg0, tree arg1)
1754 {
1755   tree type = TREE_TYPE (arg0);
1756
1757   if (arg0 == error_mark_node || arg1 == error_mark_node)
1758     return error_mark_node;
1759
1760   gcc_assert (int_binop_types_match_p (code, TREE_TYPE (arg0),
1761                                        TREE_TYPE (arg1)));
1762
1763   /* Handle the special case of two integer constants faster.  */
1764   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1765     {
1766       /* And some specific cases even faster than that.  */
1767       if (code == PLUS_EXPR)
1768         {
1769           if (integer_zerop (arg0) && !TREE_OVERFLOW (arg0))
1770             return arg1;
1771           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
1772             return arg0;
1773         }
1774       else if (code == MINUS_EXPR)
1775         {
1776           if (integer_zerop (arg1) && !TREE_OVERFLOW (arg1))
1777             return arg0;
1778         }
1779       else if (code == MULT_EXPR)
1780         {
1781           if (integer_onep (arg0) && !TREE_OVERFLOW (arg0))
1782             return arg1;
1783         }
1784
1785       /* Handle general case of two integer constants.  For sizetype
1786          constant calculations we always want to know about overflow,
1787          even in the unsigned case.  */
1788       return int_const_binop_1 (code, arg0, arg1, -1);
1789     }
1790
1791   return fold_build2_loc (loc, code, type, arg0, arg1);
1792 }
1793
1794 /* Given two values, either both of sizetype or both of bitsizetype,
1795    compute the difference between the two values.  Return the value
1796    in signed type corresponding to the type of the operands.  */
1797
1798 tree
1799 size_diffop_loc (location_t loc, tree arg0, tree arg1)
1800 {
1801   tree type = TREE_TYPE (arg0);
1802   tree ctype;
1803
1804   gcc_assert (int_binop_types_match_p (MINUS_EXPR, TREE_TYPE (arg0),
1805                                        TREE_TYPE (arg1)));
1806
1807   /* If the type is already signed, just do the simple thing.  */
1808   if (!TYPE_UNSIGNED (type))
1809     return size_binop_loc (loc, MINUS_EXPR, arg0, arg1);
1810
1811   if (type == sizetype)
1812     ctype = ssizetype;
1813   else if (type == bitsizetype)
1814     ctype = sbitsizetype;
1815   else
1816     ctype = signed_type_for (type);
1817
1818   /* If either operand is not a constant, do the conversions to the signed
1819      type and subtract.  The hardware will do the right thing with any
1820      overflow in the subtraction.  */
1821   if (TREE_CODE (arg0) != INTEGER_CST || TREE_CODE (arg1) != INTEGER_CST)
1822     return size_binop_loc (loc, MINUS_EXPR,
1823                            fold_convert_loc (loc, ctype, arg0),
1824                            fold_convert_loc (loc, ctype, arg1));
1825
1826   /* If ARG0 is larger than ARG1, subtract and return the result in CTYPE.
1827      Otherwise, subtract the other way, convert to CTYPE (we know that can't
1828      overflow) and negate (which can't either).  Special-case a result
1829      of zero while we're here.  */
1830   if (tree_int_cst_equal (arg0, arg1))
1831     return build_int_cst (ctype, 0);
1832   else if (tree_int_cst_lt (arg1, arg0))
1833     return fold_convert_loc (loc, ctype,
1834                              size_binop_loc (loc, MINUS_EXPR, arg0, arg1));
1835   else
1836     return size_binop_loc (loc, MINUS_EXPR, build_int_cst (ctype, 0),
1837                            fold_convert_loc (loc, ctype,
1838                                              size_binop_loc (loc,
1839                                                              MINUS_EXPR,
1840                                                              arg1, arg0)));
1841 }
1842 \f
1843 /* A subroutine of fold_convert_const handling conversions of an
1844    INTEGER_CST to another integer type.  */
1845
1846 static tree
1847 fold_convert_const_int_from_int (tree type, const_tree arg1)
1848 {
1849   /* Given an integer constant, make new constant with new type,
1850      appropriately sign-extended or truncated.  Use widest_int
1851      so that any extension is done according ARG1's type.  */
1852   return force_fit_type (type, wi::to_widest (arg1),
1853                          !POINTER_TYPE_P (TREE_TYPE (arg1)),
1854                          TREE_OVERFLOW (arg1));
1855 }
1856
1857 /* A subroutine of fold_convert_const handling conversions a REAL_CST
1858    to an integer type.  */
1859
1860 static tree
1861 fold_convert_const_int_from_real (enum tree_code code, tree type, const_tree arg1)
1862 {
1863   bool overflow = false;
1864   tree t;
1865
1866   /* The following code implements the floating point to integer
1867      conversion rules required by the Java Language Specification,
1868      that IEEE NaNs are mapped to zero and values that overflow
1869      the target precision saturate, i.e. values greater than
1870      INT_MAX are mapped to INT_MAX, and values less than INT_MIN
1871      are mapped to INT_MIN.  These semantics are allowed by the
1872      C and C++ standards that simply state that the behavior of
1873      FP-to-integer conversion is unspecified upon overflow.  */
1874
1875   wide_int val;
1876   REAL_VALUE_TYPE r;
1877   REAL_VALUE_TYPE x = TREE_REAL_CST (arg1);
1878
1879   switch (code)
1880     {
1881     case FIX_TRUNC_EXPR:
1882       real_trunc (&r, VOIDmode, &x);
1883       break;
1884
1885     default:
1886       gcc_unreachable ();
1887     }
1888
1889   /* If R is NaN, return zero and show we have an overflow.  */
1890   if (REAL_VALUE_ISNAN (r))
1891     {
1892       overflow = true;
1893       val = wi::zero (TYPE_PRECISION (type));
1894     }
1895
1896   /* See if R is less than the lower bound or greater than the
1897      upper bound.  */
1898
1899   if (! overflow)
1900     {
1901       tree lt = TYPE_MIN_VALUE (type);
1902       REAL_VALUE_TYPE l = real_value_from_int_cst (NULL_TREE, lt);
1903       if (REAL_VALUES_LESS (r, l))
1904         {
1905           overflow = true;
1906           val = lt;
1907         }
1908     }
1909
1910   if (! overflow)
1911     {
1912       tree ut = TYPE_MAX_VALUE (type);
1913       if (ut)
1914         {
1915           REAL_VALUE_TYPE u = real_value_from_int_cst (NULL_TREE, ut);
1916           if (REAL_VALUES_LESS (u, r))
1917             {
1918               overflow = true;
1919               val = ut;
1920             }
1921         }
1922     }
1923
1924   if (! overflow)
1925     val = real_to_integer (&r, &overflow, TYPE_PRECISION (type));
1926
1927   t = force_fit_type (type, val, -1, overflow | TREE_OVERFLOW (arg1));
1928   return t;
1929 }
1930
1931 /* A subroutine of fold_convert_const handling conversions of a
1932    FIXED_CST to an integer type.  */
1933
1934 static tree
1935 fold_convert_const_int_from_fixed (tree type, const_tree arg1)
1936 {
1937   tree t;
1938   double_int temp, temp_trunc;
1939   unsigned int mode;
1940
1941   /* Right shift FIXED_CST to temp by fbit.  */
1942   temp = TREE_FIXED_CST (arg1).data;
1943   mode = TREE_FIXED_CST (arg1).mode;
1944   if (GET_MODE_FBIT (mode) < HOST_BITS_PER_DOUBLE_INT)
1945     {
1946       temp = temp.rshift (GET_MODE_FBIT (mode),
1947                           HOST_BITS_PER_DOUBLE_INT,
1948                           SIGNED_FIXED_POINT_MODE_P (mode));
1949
1950       /* Left shift temp to temp_trunc by fbit.  */
1951       temp_trunc = temp.lshift (GET_MODE_FBIT (mode),
1952                                 HOST_BITS_PER_DOUBLE_INT,
1953                                 SIGNED_FIXED_POINT_MODE_P (mode));
1954     }
1955   else
1956     {
1957       temp = double_int_zero;
1958       temp_trunc = double_int_zero;
1959     }
1960
1961   /* If FIXED_CST is negative, we need to round the value toward 0.
1962      By checking if the fractional bits are not zero to add 1 to temp.  */
1963   if (SIGNED_FIXED_POINT_MODE_P (mode)
1964       && temp_trunc.is_negative ()
1965       && TREE_FIXED_CST (arg1).data != temp_trunc)
1966     temp += double_int_one;
1967
1968   /* Given a fixed-point constant, make new constant with new type,
1969      appropriately sign-extended or truncated.  */
1970   t = force_fit_type (type, temp, -1,
1971                       (temp.is_negative ()
1972                        && (TYPE_UNSIGNED (type)
1973                            < TYPE_UNSIGNED (TREE_TYPE (arg1))))
1974                       | TREE_OVERFLOW (arg1));
1975
1976   return t;
1977 }
1978
1979 /* A subroutine of fold_convert_const handling conversions a REAL_CST
1980    to another floating point type.  */
1981
1982 static tree
1983 fold_convert_const_real_from_real (tree type, const_tree arg1)
1984 {
1985   REAL_VALUE_TYPE value;
1986   tree t;
1987
1988   real_convert (&value, TYPE_MODE (type), &TREE_REAL_CST (arg1));
1989   t = build_real (type, value);
1990
1991   /* If converting an infinity or NAN to a representation that doesn't
1992      have one, set the overflow bit so that we can produce some kind of
1993      error message at the appropriate point if necessary.  It's not the
1994      most user-friendly message, but it's better than nothing.  */
1995   if (REAL_VALUE_ISINF (TREE_REAL_CST (arg1))
1996       && !MODE_HAS_INFINITIES (TYPE_MODE (type)))
1997     TREE_OVERFLOW (t) = 1;
1998   else if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
1999            && !MODE_HAS_NANS (TYPE_MODE (type)))
2000     TREE_OVERFLOW (t) = 1;
2001   /* Regular overflow, conversion produced an infinity in a mode that
2002      can't represent them.  */
2003   else if (!MODE_HAS_INFINITIES (TYPE_MODE (type))
2004            && REAL_VALUE_ISINF (value)
2005            && !REAL_VALUE_ISINF (TREE_REAL_CST (arg1)))
2006     TREE_OVERFLOW (t) = 1;
2007   else
2008     TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2009   return t;
2010 }
2011
2012 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2013    to a floating point type.  */
2014
2015 static tree
2016 fold_convert_const_real_from_fixed (tree type, const_tree arg1)
2017 {
2018   REAL_VALUE_TYPE value;
2019   tree t;
2020
2021   real_convert_from_fixed (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1));
2022   t = build_real (type, value);
2023
2024   TREE_OVERFLOW (t) = TREE_OVERFLOW (arg1);
2025   return t;
2026 }
2027
2028 /* A subroutine of fold_convert_const handling conversions a FIXED_CST
2029    to another fixed-point type.  */
2030
2031 static tree
2032 fold_convert_const_fixed_from_fixed (tree type, const_tree arg1)
2033 {
2034   FIXED_VALUE_TYPE value;
2035   tree t;
2036   bool overflow_p;
2037
2038   overflow_p = fixed_convert (&value, TYPE_MODE (type), &TREE_FIXED_CST (arg1),
2039                               TYPE_SATURATING (type));
2040   t = build_fixed (type, value);
2041
2042   /* Propagate overflow flags.  */
2043   if (overflow_p | TREE_OVERFLOW (arg1))
2044     TREE_OVERFLOW (t) = 1;
2045   return t;
2046 }
2047
2048 /* A subroutine of fold_convert_const handling conversions an INTEGER_CST
2049    to a fixed-point type.  */
2050
2051 static tree
2052 fold_convert_const_fixed_from_int (tree type, const_tree arg1)
2053 {
2054   FIXED_VALUE_TYPE value;
2055   tree t;
2056   bool overflow_p;
2057   double_int di;
2058
2059   gcc_assert (TREE_INT_CST_NUNITS (arg1) <= 2);
2060
2061   di.low = TREE_INT_CST_ELT (arg1, 0);
2062   if (TREE_INT_CST_NUNITS (arg1) == 1)
2063     di.high = (HOST_WIDE_INT) di.low < 0 ? (HOST_WIDE_INT) -1 : 0;
2064   else
2065     di.high = TREE_INT_CST_ELT (arg1, 1);
2066
2067   overflow_p = fixed_convert_from_int (&value, TYPE_MODE (type), di,
2068                                        TYPE_UNSIGNED (TREE_TYPE (arg1)),
2069                                        TYPE_SATURATING (type));
2070   t = build_fixed (type, value);
2071
2072   /* Propagate overflow flags.  */
2073   if (overflow_p | TREE_OVERFLOW (arg1))
2074     TREE_OVERFLOW (t) = 1;
2075   return t;
2076 }
2077
2078 /* A subroutine of fold_convert_const handling conversions a REAL_CST
2079    to a fixed-point type.  */
2080
2081 static tree
2082 fold_convert_const_fixed_from_real (tree type, const_tree arg1)
2083 {
2084   FIXED_VALUE_TYPE value;
2085   tree t;
2086   bool overflow_p;
2087
2088   overflow_p = fixed_convert_from_real (&value, TYPE_MODE (type),
2089                                         &TREE_REAL_CST (arg1),
2090                                         TYPE_SATURATING (type));
2091   t = build_fixed (type, value);
2092
2093   /* Propagate overflow flags.  */
2094   if (overflow_p | TREE_OVERFLOW (arg1))
2095     TREE_OVERFLOW (t) = 1;
2096   return t;
2097 }
2098
2099 /* Attempt to fold type conversion operation CODE of expression ARG1 to
2100    type TYPE.  If no simplification can be done return NULL_TREE.  */
2101
2102 static tree
2103 fold_convert_const (enum tree_code code, tree type, tree arg1)
2104 {
2105   if (TREE_TYPE (arg1) == type)
2106     return arg1;
2107
2108   if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type)
2109       || TREE_CODE (type) == OFFSET_TYPE)
2110     {
2111       if (TREE_CODE (arg1) == INTEGER_CST)
2112         return fold_convert_const_int_from_int (type, arg1);
2113       else if (TREE_CODE (arg1) == REAL_CST)
2114         return fold_convert_const_int_from_real (code, type, arg1);
2115       else if (TREE_CODE (arg1) == FIXED_CST)
2116         return fold_convert_const_int_from_fixed (type, arg1);
2117     }
2118   else if (TREE_CODE (type) == REAL_TYPE)
2119     {
2120       if (TREE_CODE (arg1) == INTEGER_CST)
2121         return build_real_from_int_cst (type, arg1);
2122       else if (TREE_CODE (arg1) == REAL_CST)
2123         return fold_convert_const_real_from_real (type, arg1);
2124       else if (TREE_CODE (arg1) == FIXED_CST)
2125         return fold_convert_const_real_from_fixed (type, arg1);
2126     }
2127   else if (TREE_CODE (type) == FIXED_POINT_TYPE)
2128     {
2129       if (TREE_CODE (arg1) == FIXED_CST)
2130         return fold_convert_const_fixed_from_fixed (type, arg1);
2131       else if (TREE_CODE (arg1) == INTEGER_CST)
2132         return fold_convert_const_fixed_from_int (type, arg1);
2133       else if (TREE_CODE (arg1) == REAL_CST)
2134         return fold_convert_const_fixed_from_real (type, arg1);
2135     }
2136   return NULL_TREE;
2137 }
2138
2139 /* Construct a vector of zero elements of vector type TYPE.  */
2140
2141 static tree
2142 build_zero_vector (tree type)
2143 {
2144   tree t;
2145
2146   t = fold_convert_const (NOP_EXPR, TREE_TYPE (type), integer_zero_node);
2147   return build_vector_from_val (type, t);
2148 }
2149
2150 /* Returns true, if ARG is convertible to TYPE using a NOP_EXPR.  */
2151
2152 bool
2153 fold_convertible_p (const_tree type, const_tree arg)
2154 {
2155   tree orig = TREE_TYPE (arg);
2156
2157   if (type == orig)
2158     return true;
2159
2160   if (TREE_CODE (arg) == ERROR_MARK
2161       || TREE_CODE (type) == ERROR_MARK
2162       || TREE_CODE (orig) == ERROR_MARK)
2163     return false;
2164
2165   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2166     return true;
2167
2168   switch (TREE_CODE (type))
2169     {
2170     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2171     case POINTER_TYPE: case REFERENCE_TYPE:
2172     case OFFSET_TYPE:
2173       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2174           || TREE_CODE (orig) == OFFSET_TYPE)
2175         return true;
2176       return (TREE_CODE (orig) == VECTOR_TYPE
2177               && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2178
2179     case REAL_TYPE:
2180     case FIXED_POINT_TYPE:
2181     case COMPLEX_TYPE:
2182     case VECTOR_TYPE:
2183     case VOID_TYPE:
2184       return TREE_CODE (type) == TREE_CODE (orig);
2185
2186     default:
2187       return false;
2188     }
2189 }
2190
2191 /* Convert expression ARG to type TYPE.  Used by the middle-end for
2192    simple conversions in preference to calling the front-end's convert.  */
2193
2194 tree
2195 fold_convert_loc (location_t loc, tree type, tree arg)
2196 {
2197   tree orig = TREE_TYPE (arg);
2198   tree tem;
2199
2200   if (type == orig)
2201     return arg;
2202
2203   if (TREE_CODE (arg) == ERROR_MARK
2204       || TREE_CODE (type) == ERROR_MARK
2205       || TREE_CODE (orig) == ERROR_MARK)
2206     return error_mark_node;
2207
2208   switch (TREE_CODE (type))
2209     {
2210     case POINTER_TYPE:
2211     case REFERENCE_TYPE:
2212       /* Handle conversions between pointers to different address spaces.  */
2213       if (POINTER_TYPE_P (orig)
2214           && (TYPE_ADDR_SPACE (TREE_TYPE (type))
2215               != TYPE_ADDR_SPACE (TREE_TYPE (orig))))
2216         return fold_build1_loc (loc, ADDR_SPACE_CONVERT_EXPR, type, arg);
2217       /* fall through */
2218
2219     case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
2220     case OFFSET_TYPE:
2221       if (TREE_CODE (arg) == INTEGER_CST)
2222         {
2223           tem = fold_convert_const (NOP_EXPR, type, arg);
2224           if (tem != NULL_TREE)
2225             return tem;
2226         }
2227       if (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2228           || TREE_CODE (orig) == OFFSET_TYPE)
2229         return fold_build1_loc (loc, NOP_EXPR, type, arg);
2230       if (TREE_CODE (orig) == COMPLEX_TYPE)
2231         return fold_convert_loc (loc, type,
2232                              fold_build1_loc (loc, REALPART_EXPR,
2233                                           TREE_TYPE (orig), arg));
2234       gcc_assert (TREE_CODE (orig) == VECTOR_TYPE
2235                   && tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2236       return fold_build1_loc (loc, NOP_EXPR, type, arg);
2237
2238     case REAL_TYPE:
2239       if (TREE_CODE (arg) == INTEGER_CST)
2240         {
2241           tem = fold_convert_const (FLOAT_EXPR, type, arg);
2242           if (tem != NULL_TREE)
2243             return tem;
2244         }
2245       else if (TREE_CODE (arg) == REAL_CST)
2246         {
2247           tem = fold_convert_const (NOP_EXPR, type, arg);
2248           if (tem != NULL_TREE)
2249             return tem;
2250         }
2251       else if (TREE_CODE (arg) == FIXED_CST)
2252         {
2253           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2254           if (tem != NULL_TREE)
2255             return tem;
2256         }
2257
2258       switch (TREE_CODE (orig))
2259         {
2260         case INTEGER_TYPE:
2261         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2262         case POINTER_TYPE: case REFERENCE_TYPE:
2263           return fold_build1_loc (loc, FLOAT_EXPR, type, arg);
2264
2265         case REAL_TYPE:
2266           return fold_build1_loc (loc, NOP_EXPR, type, arg);
2267
2268         case FIXED_POINT_TYPE:
2269           return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg);
2270
2271         case COMPLEX_TYPE:
2272           tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2273           return fold_convert_loc (loc, type, tem);
2274
2275         default:
2276           gcc_unreachable ();
2277         }
2278
2279     case FIXED_POINT_TYPE:
2280       if (TREE_CODE (arg) == FIXED_CST || TREE_CODE (arg) == INTEGER_CST
2281           || TREE_CODE (arg) == REAL_CST)
2282         {
2283           tem = fold_convert_const (FIXED_CONVERT_EXPR, type, arg);
2284           if (tem != NULL_TREE)
2285             goto fold_convert_exit;
2286         }
2287
2288       switch (TREE_CODE (orig))
2289         {
2290         case FIXED_POINT_TYPE:
2291         case INTEGER_TYPE:
2292         case ENUMERAL_TYPE:
2293         case BOOLEAN_TYPE:
2294         case REAL_TYPE:
2295           return fold_build1_loc (loc, FIXED_CONVERT_EXPR, type, arg);
2296
2297         case COMPLEX_TYPE:
2298           tem = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2299           return fold_convert_loc (loc, type, tem);
2300
2301         default:
2302           gcc_unreachable ();
2303         }
2304
2305     case COMPLEX_TYPE:
2306       switch (TREE_CODE (orig))
2307         {
2308         case INTEGER_TYPE:
2309         case BOOLEAN_TYPE: case ENUMERAL_TYPE:
2310         case POINTER_TYPE: case REFERENCE_TYPE:
2311         case REAL_TYPE:
2312         case FIXED_POINT_TYPE:
2313           return fold_build2_loc (loc, COMPLEX_EXPR, type,
2314                               fold_convert_loc (loc, TREE_TYPE (type), arg),
2315                               fold_convert_loc (loc, TREE_TYPE (type),
2316                                             integer_zero_node));
2317         case COMPLEX_TYPE:
2318           {
2319             tree rpart, ipart;
2320
2321             if (TREE_CODE (arg) == COMPLEX_EXPR)
2322               {
2323                 rpart = fold_convert_loc (loc, TREE_TYPE (type),
2324                                       TREE_OPERAND (arg, 0));
2325                 ipart = fold_convert_loc (loc, TREE_TYPE (type),
2326                                       TREE_OPERAND (arg, 1));
2327                 return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart);
2328               }
2329
2330             arg = save_expr (arg);
2331             rpart = fold_build1_loc (loc, REALPART_EXPR, TREE_TYPE (orig), arg);
2332             ipart = fold_build1_loc (loc, IMAGPART_EXPR, TREE_TYPE (orig), arg);
2333             rpart = fold_convert_loc (loc, TREE_TYPE (type), rpart);
2334             ipart = fold_convert_loc (loc, TREE_TYPE (type), ipart);
2335             return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart, ipart);
2336           }
2337
2338         default:
2339           gcc_unreachable ();
2340         }
2341
2342     case VECTOR_TYPE:
2343       if (integer_zerop (arg))
2344         return build_zero_vector (type);
2345       gcc_assert (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (orig)));
2346       gcc_assert (INTEGRAL_TYPE_P (orig) || POINTER_TYPE_P (orig)
2347                   || TREE_CODE (orig) == VECTOR_TYPE);
2348       return fold_build1_loc (loc, VIEW_CONVERT_EXPR, type, arg);
2349
2350     case VOID_TYPE:
2351       tem = fold_ignored_result (arg);
2352       return fold_build1_loc (loc, NOP_EXPR, type, tem);
2353
2354     default:
2355       if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
2356         return fold_build1_loc (loc, NOP_EXPR, type, arg);
2357       gcc_unreachable ();
2358     }
2359  fold_convert_exit:
2360   protected_set_expr_location_unshare (tem, loc);
2361   return tem;
2362 }
2363 \f
2364 /* Return false if expr can be assumed not to be an lvalue, true
2365    otherwise.  */
2366
2367 static bool
2368 maybe_lvalue_p (const_tree x)
2369 {
2370   /* We only need to wrap lvalue tree codes.  */
2371   switch (TREE_CODE (x))
2372   {
2373   case VAR_DECL:
2374   case PARM_DECL:
2375   case RESULT_DECL:
2376   case LABEL_DECL:
2377   case FUNCTION_DECL:
2378   case SSA_NAME:
2379
2380   case COMPONENT_REF:
2381   case MEM_REF:
2382   case INDIRECT_REF:
2383   case ARRAY_REF:
2384   case ARRAY_RANGE_REF:
2385   case BIT_FIELD_REF:
2386   case OBJ_TYPE_REF:
2387
2388   case REALPART_EXPR:
2389   case IMAGPART_EXPR:
2390   case PREINCREMENT_EXPR:
2391   case PREDECREMENT_EXPR:
2392   case SAVE_EXPR:
2393   case TRY_CATCH_EXPR:
2394   case WITH_CLEANUP_EXPR:
2395   case COMPOUND_EXPR:
2396   case MODIFY_EXPR:
2397   case TARGET_EXPR:
2398   case COND_EXPR:
2399   case BIND_EXPR:
2400     break;
2401
2402   default:
2403     /* Assume the worst for front-end tree codes.  */
2404     if ((int)TREE_CODE (x) >= NUM_TREE_CODES)
2405       break;
2406     return false;
2407   }
2408
2409   return true;
2410 }
2411
2412 /* Return an expr equal to X but certainly not valid as an lvalue.  */
2413
2414 tree
2415 non_lvalue_loc (location_t loc, tree x)
2416 {
2417   /* While we are in GIMPLE, NON_LVALUE_EXPR doesn't mean anything to
2418      us.  */
2419   if (in_gimple_form)
2420     return x;
2421
2422   if (! maybe_lvalue_p (x))
2423     return x;
2424   return build1_loc (loc, NON_LVALUE_EXPR, TREE_TYPE (x), x);
2425 }
2426
2427 /* When pedantic, return an expr equal to X but certainly not valid as a
2428    pedantic lvalue.  Otherwise, return X.  */
2429
2430 static tree
2431 pedantic_non_lvalue_loc (location_t loc, tree x)
2432 {
2433   return protected_set_expr_location_unshare (x, loc);
2434 }
2435 \f
2436 /* Given a tree comparison code, return the code that is the logical inverse.
2437    It is generally not safe to do this for floating-point comparisons, except
2438    for EQ_EXPR, NE_EXPR, ORDERED_EXPR and UNORDERED_EXPR, so we return
2439    ERROR_MARK in this case.  */
2440
2441 enum tree_code
2442 invert_tree_comparison (enum tree_code code, bool honor_nans)
2443 {
2444   if (honor_nans && flag_trapping_math && code != EQ_EXPR && code != NE_EXPR
2445       && code != ORDERED_EXPR && code != UNORDERED_EXPR)
2446     return ERROR_MARK;
2447
2448   switch (code)
2449     {
2450     case EQ_EXPR:
2451       return NE_EXPR;
2452     case NE_EXPR:
2453       return EQ_EXPR;
2454     case GT_EXPR:
2455       return honor_nans ? UNLE_EXPR : LE_EXPR;
2456     case GE_EXPR:
2457       return honor_nans ? UNLT_EXPR : LT_EXPR;
2458     case LT_EXPR:
2459       return honor_nans ? UNGE_EXPR : GE_EXPR;
2460     case LE_EXPR:
2461       return honor_nans ? UNGT_EXPR : GT_EXPR;
2462     case LTGT_EXPR:
2463       return UNEQ_EXPR;
2464     case UNEQ_EXPR:
2465       return LTGT_EXPR;
2466     case UNGT_EXPR:
2467       return LE_EXPR;
2468     case UNGE_EXPR:
2469       return LT_EXPR;
2470     case UNLT_EXPR:
2471       return GE_EXPR;
2472     case UNLE_EXPR:
2473       return GT_EXPR;
2474     case ORDERED_EXPR:
2475       return UNORDERED_EXPR;
2476     case UNORDERED_EXPR:
2477       return ORDERED_EXPR;
2478     default:
2479       gcc_unreachable ();
2480     }
2481 }
2482
2483 /* Similar, but return the comparison that results if the operands are
2484    swapped.  This is safe for floating-point.  */
2485
2486 enum tree_code
2487 swap_tree_comparison (enum tree_code code)
2488 {
2489   switch (code)
2490     {
2491     case EQ_EXPR:
2492     case NE_EXPR:
2493     case ORDERED_EXPR:
2494     case UNORDERED_EXPR:
2495     case LTGT_EXPR:
2496     case UNEQ_EXPR:
2497       return code;
2498     case GT_EXPR:
2499       return LT_EXPR;
2500     case GE_EXPR:
2501       return LE_EXPR;
2502     case LT_EXPR:
2503       return GT_EXPR;
2504     case LE_EXPR:
2505       return GE_EXPR;
2506     case UNGT_EXPR:
2507       return UNLT_EXPR;
2508     case UNGE_EXPR:
2509       return UNLE_EXPR;
2510     case UNLT_EXPR:
2511       return UNGT_EXPR;
2512     case UNLE_EXPR:
2513       return UNGE_EXPR;
2514     default:
2515       gcc_unreachable ();
2516     }
2517 }
2518
2519
2520 /* Convert a comparison tree code from an enum tree_code representation
2521    into a compcode bit-based encoding.  This function is the inverse of
2522    compcode_to_comparison.  */
2523
2524 static enum comparison_code
2525 comparison_to_compcode (enum tree_code code)
2526 {
2527   switch (code)
2528     {
2529     case LT_EXPR:
2530       return COMPCODE_LT;
2531     case EQ_EXPR:
2532       return COMPCODE_EQ;
2533     case LE_EXPR:
2534       return COMPCODE_LE;
2535     case GT_EXPR:
2536       return COMPCODE_GT;
2537     case NE_EXPR:
2538       return COMPCODE_NE;
2539     case GE_EXPR:
2540       return COMPCODE_GE;
2541     case ORDERED_EXPR:
2542       return COMPCODE_ORD;
2543     case UNORDERED_EXPR:
2544       return COMPCODE_UNORD;
2545     case UNLT_EXPR:
2546       return COMPCODE_UNLT;
2547     case UNEQ_EXPR:
2548       return COMPCODE_UNEQ;
2549     case UNLE_EXPR:
2550       return COMPCODE_UNLE;
2551     case UNGT_EXPR:
2552       return COMPCODE_UNGT;
2553     case LTGT_EXPR:
2554       return COMPCODE_LTGT;
2555     case UNGE_EXPR:
2556       return COMPCODE_UNGE;
2557     default:
2558       gcc_unreachable ();
2559     }
2560 }
2561
2562 /* Convert a compcode bit-based encoding of a comparison operator back
2563    to GCC's enum tree_code representation.  This function is the
2564    inverse of comparison_to_compcode.  */
2565
2566 static enum tree_code
2567 compcode_to_comparison (enum comparison_code code)
2568 {
2569   switch (code)
2570     {
2571     case COMPCODE_LT:
2572       return LT_EXPR;
2573     case COMPCODE_EQ:
2574       return EQ_EXPR;
2575     case COMPCODE_LE:
2576       return LE_EXPR;
2577     case COMPCODE_GT:
2578       return GT_EXPR;
2579     case COMPCODE_NE:
2580       return NE_EXPR;
2581     case COMPCODE_GE:
2582       return GE_EXPR;
2583     case COMPCODE_ORD:
2584       return ORDERED_EXPR;
2585     case COMPCODE_UNORD:
2586       return UNORDERED_EXPR;
2587     case COMPCODE_UNLT:
2588       return UNLT_EXPR;
2589     case COMPCODE_UNEQ:
2590       return UNEQ_EXPR;
2591     case COMPCODE_UNLE:
2592       return UNLE_EXPR;
2593     case COMPCODE_UNGT:
2594       return UNGT_EXPR;
2595     case COMPCODE_LTGT:
2596       return LTGT_EXPR;
2597     case COMPCODE_UNGE:
2598       return UNGE_EXPR;
2599     default:
2600       gcc_unreachable ();
2601     }
2602 }
2603
2604 /* Return a tree for the comparison which is the combination of
2605    doing the AND or OR (depending on CODE) of the two operations LCODE
2606    and RCODE on the identical operands LL_ARG and LR_ARG.  Take into account
2607    the possibility of trapping if the mode has NaNs, and return NULL_TREE
2608    if this makes the transformation invalid.  */
2609
2610 tree
2611 combine_comparisons (location_t loc,
2612                      enum tree_code code, enum tree_code lcode,
2613                      enum tree_code rcode, tree truth_type,
2614                      tree ll_arg, tree lr_arg)
2615 {
2616   bool honor_nans = HONOR_NANS (ll_arg);
2617   enum comparison_code lcompcode = comparison_to_compcode (lcode);
2618   enum comparison_code rcompcode = comparison_to_compcode (rcode);
2619   int compcode;
2620
2621   switch (code)
2622     {
2623     case TRUTH_AND_EXPR: case TRUTH_ANDIF_EXPR:
2624       compcode = lcompcode & rcompcode;
2625       break;
2626
2627     case TRUTH_OR_EXPR: case TRUTH_ORIF_EXPR:
2628       compcode = lcompcode | rcompcode;
2629       break;
2630
2631     default:
2632       return NULL_TREE;
2633     }
2634
2635   if (!honor_nans)
2636     {
2637       /* Eliminate unordered comparisons, as well as LTGT and ORD
2638          which are not used unless the mode has NaNs.  */
2639       compcode &= ~COMPCODE_UNORD;
2640       if (compcode == COMPCODE_LTGT)
2641         compcode = COMPCODE_NE;
2642       else if (compcode == COMPCODE_ORD)
2643         compcode = COMPCODE_TRUE;
2644     }
2645    else if (flag_trapping_math)
2646      {
2647         /* Check that the original operation and the optimized ones will trap
2648            under the same condition.  */
2649         bool ltrap = (lcompcode & COMPCODE_UNORD) == 0
2650                      && (lcompcode != COMPCODE_EQ)
2651                      && (lcompcode != COMPCODE_ORD);
2652         bool rtrap = (rcompcode & COMPCODE_UNORD) == 0
2653                      && (rcompcode != COMPCODE_EQ)
2654                      && (rcompcode != COMPCODE_ORD);
2655         bool trap = (compcode & COMPCODE_UNORD) == 0
2656                     && (compcode != COMPCODE_EQ)
2657                     && (compcode != COMPCODE_ORD);
2658
2659         /* In a short-circuited boolean expression the LHS might be
2660            such that the RHS, if evaluated, will never trap.  For
2661            example, in ORD (x, y) && (x < y), we evaluate the RHS only
2662            if neither x nor y is NaN.  (This is a mixed blessing: for
2663            example, the expression above will never trap, hence
2664            optimizing it to x < y would be invalid).  */
2665         if ((code == TRUTH_ORIF_EXPR && (lcompcode & COMPCODE_UNORD))
2666             || (code == TRUTH_ANDIF_EXPR && !(lcompcode & COMPCODE_UNORD)))
2667           rtrap = false;
2668
2669         /* If the comparison was short-circuited, and only the RHS
2670            trapped, we may now generate a spurious trap.  */
2671         if (rtrap && !ltrap
2672             && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
2673           return NULL_TREE;
2674
2675         /* If we changed the conditions that cause a trap, we lose.  */
2676         if ((ltrap || rtrap) != trap)
2677           return NULL_TREE;
2678       }
2679
2680   if (compcode == COMPCODE_TRUE)
2681     return constant_boolean_node (true, truth_type);
2682   else if (compcode == COMPCODE_FALSE)
2683     return constant_boolean_node (false, truth_type);
2684   else
2685     {
2686       enum tree_code tcode;
2687
2688       tcode = compcode_to_comparison ((enum comparison_code) compcode);
2689       return fold_build2_loc (loc, tcode, truth_type, ll_arg, lr_arg);
2690     }
2691 }
2692 \f
2693 /* Return nonzero if two operands (typically of the same tree node)
2694    are necessarily equal.  If either argument has side-effects this
2695    function returns zero.  FLAGS modifies behavior as follows:
2696
2697    If OEP_ONLY_CONST is set, only return nonzero for constants.
2698    This function tests whether the operands are indistinguishable;
2699    it does not test whether they are equal using C's == operation.
2700    The distinction is important for IEEE floating point, because
2701    (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and
2702    (2) two NaNs may be indistinguishable, but NaN!=NaN.
2703
2704    If OEP_ONLY_CONST is unset, a VAR_DECL is considered equal to itself
2705    even though it may hold multiple values during a function.
2706    This is because a GCC tree node guarantees that nothing else is
2707    executed between the evaluation of its "operands" (which may often
2708    be evaluated in arbitrary order).  Hence if the operands themselves
2709    don't side-effect, the VAR_DECLs, PARM_DECLs etc... must hold the
2710    same value in each operand/subexpression.  Hence leaving OEP_ONLY_CONST
2711    unset means assuming isochronic (or instantaneous) tree equivalence.
2712    Unless comparing arbitrary expression trees, such as from different
2713    statements, this flag can usually be left unset.
2714
2715    If OEP_PURE_SAME is set, then pure functions with identical arguments
2716    are considered the same.  It is used when the caller has other ways
2717    to ensure that global memory is unchanged in between.  */
2718
2719 int
2720 operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
2721 {
2722   /* If either is ERROR_MARK, they aren't equal.  */
2723   if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK
2724       || TREE_TYPE (arg0) == error_mark_node
2725       || TREE_TYPE (arg1) == error_mark_node)
2726     return 0;
2727
2728   /* Similar, if either does not have a type (like a released SSA name), 
2729      they aren't equal.  */
2730   if (!TREE_TYPE (arg0) || !TREE_TYPE (arg1))
2731     return 0;
2732
2733   /* Check equality of integer constants before bailing out due to
2734      precision differences.  */
2735   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2736     return tree_int_cst_equal (arg0, arg1);
2737
2738   /* If both types don't have the same signedness, then we can't consider
2739      them equal.  We must check this before the STRIP_NOPS calls
2740      because they may change the signedness of the arguments.  As pointers
2741      strictly don't have a signedness, require either two pointers or
2742      two non-pointers as well.  */
2743   if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1))
2744       || POINTER_TYPE_P (TREE_TYPE (arg0)) != POINTER_TYPE_P (TREE_TYPE (arg1)))
2745     return 0;
2746
2747   /* We cannot consider pointers to different address space equal.  */
2748   if (POINTER_TYPE_P (TREE_TYPE (arg0)) && POINTER_TYPE_P (TREE_TYPE (arg1))
2749       && (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg0)))
2750           != TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (arg1)))))
2751     return 0;
2752
2753   /* If both types don't have the same precision, then it is not safe
2754      to strip NOPs.  */
2755   if (element_precision (TREE_TYPE (arg0))
2756       != element_precision (TREE_TYPE (arg1)))
2757     return 0;
2758
2759   STRIP_NOPS (arg0);
2760   STRIP_NOPS (arg1);
2761
2762   /* In case both args are comparisons but with different comparison
2763      code, try to swap the comparison operands of one arg to produce
2764      a match and compare that variant.  */
2765   if (TREE_CODE (arg0) != TREE_CODE (arg1)
2766       && COMPARISON_CLASS_P (arg0)
2767       && COMPARISON_CLASS_P (arg1))
2768     {
2769       enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1));
2770
2771       if (TREE_CODE (arg0) == swap_code)
2772         return operand_equal_p (TREE_OPERAND (arg0, 0),
2773                                 TREE_OPERAND (arg1, 1), flags)
2774                && operand_equal_p (TREE_OPERAND (arg0, 1),
2775                                    TREE_OPERAND (arg1, 0), flags);
2776     }
2777
2778   if (TREE_CODE (arg0) != TREE_CODE (arg1)
2779       /* NOP_EXPR and CONVERT_EXPR are considered equal.  */
2780       && !(CONVERT_EXPR_P (arg0) && CONVERT_EXPR_P (arg1)))
2781     return 0;
2782
2783   /* This is needed for conversions and for COMPONENT_REF.
2784      Might as well play it safe and always test this.  */
2785   if (TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK
2786       || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK
2787       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
2788     return 0;
2789
2790   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
2791      We don't care about side effects in that case because the SAVE_EXPR
2792      takes care of that for us. In all other cases, two expressions are
2793      equal if they have no side effects.  If we have two identical
2794      expressions with side effects that should be treated the same due
2795      to the only side effects being identical SAVE_EXPR's, that will
2796      be detected in the recursive calls below.
2797      If we are taking an invariant address of two identical objects
2798      they are necessarily equal as well.  */
2799   if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
2800       && (TREE_CODE (arg0) == SAVE_EXPR
2801           || (flags & OEP_CONSTANT_ADDRESS_OF)
2802           || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
2803     return 1;
2804
2805   /* Next handle constant cases, those for which we can return 1 even
2806      if ONLY_CONST is set.  */
2807   if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
2808     switch (TREE_CODE (arg0))
2809       {
2810       case INTEGER_CST:
2811         return tree_int_cst_equal (arg0, arg1);
2812
2813       case FIXED_CST:
2814         return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),
2815                                        TREE_FIXED_CST (arg1));
2816
2817       case REAL_CST:
2818         if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
2819                                    TREE_REAL_CST (arg1)))
2820           return 1;
2821
2822
2823         if (!HONOR_SIGNED_ZEROS (arg0))
2824           {
2825             /* If we do not distinguish between signed and unsigned zero,
2826                consider them equal.  */
2827             if (real_zerop (arg0) && real_zerop (arg1))
2828               return 1;
2829           }
2830         return 0;
2831
2832       case VECTOR_CST:
2833         {
2834           unsigned i;
2835
2836           if (VECTOR_CST_NELTS (arg0) != VECTOR_CST_NELTS (arg1))
2837             return 0;
2838
2839           for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
2840             {
2841               if (!operand_equal_p (VECTOR_CST_ELT (arg0, i),
2842                                     VECTOR_CST_ELT (arg1, i), flags))
2843                 return 0;
2844             }
2845           return 1;
2846         }
2847
2848       case COMPLEX_CST:
2849         return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
2850                                  flags)
2851                 && operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
2852                                     flags));
2853
2854       case STRING_CST:
2855         return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
2856                 && ! memcmp (TREE_STRING_POINTER (arg0),
2857                               TREE_STRING_POINTER (arg1),
2858                               TREE_STRING_LENGTH (arg0)));
2859
2860       case ADDR_EXPR:
2861         return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
2862                                 TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1)
2863                                 ? OEP_CONSTANT_ADDRESS_OF | OEP_ADDRESS_OF : 0);
2864       default:
2865         break;
2866       }
2867
2868   if (flags & OEP_ONLY_CONST)
2869     return 0;
2870
2871 /* Define macros to test an operand from arg0 and arg1 for equality and a
2872    variant that allows null and views null as being different from any
2873    non-null value.  In the latter case, if either is null, the both
2874    must be; otherwise, do the normal comparison.  */
2875 #define OP_SAME(N) operand_equal_p (TREE_OPERAND (arg0, N),     \
2876                                     TREE_OPERAND (arg1, N), flags)
2877
2878 #define OP_SAME_WITH_NULL(N)                            \
2879   ((!TREE_OPERAND (arg0, N) || !TREE_OPERAND (arg1, N)) \
2880    ? TREE_OPERAND (arg0, N) == TREE_OPERAND (arg1, N) : OP_SAME (N))
2881
2882   switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
2883     {
2884     case tcc_unary:
2885       /* Two conversions are equal only if signedness and modes match.  */
2886       switch (TREE_CODE (arg0))
2887         {
2888         CASE_CONVERT:
2889         case FIX_TRUNC_EXPR:
2890           if (TYPE_UNSIGNED (TREE_TYPE (arg0))
2891               != TYPE_UNSIGNED (TREE_TYPE (arg1)))
2892             return 0;
2893           break;
2894         default:
2895           break;
2896         }
2897
2898       return OP_SAME (0);
2899
2900
2901     case tcc_comparison:
2902     case tcc_binary:
2903       if (OP_SAME (0) && OP_SAME (1))
2904         return 1;
2905
2906       /* For commutative ops, allow the other order.  */
2907       return (commutative_tree_code (TREE_CODE (arg0))
2908               && operand_equal_p (TREE_OPERAND (arg0, 0),
2909                                   TREE_OPERAND (arg1, 1), flags)
2910               && operand_equal_p (TREE_OPERAND (arg0, 1),
2911                                   TREE_OPERAND (arg1, 0), flags));
2912
2913     case tcc_reference:
2914       /* If either of the pointer (or reference) expressions we are
2915          dereferencing contain a side effect, these cannot be equal,
2916          but their addresses can be.  */
2917       if ((flags & OEP_CONSTANT_ADDRESS_OF) == 0
2918           && (TREE_SIDE_EFFECTS (arg0)
2919               || TREE_SIDE_EFFECTS (arg1)))
2920         return 0;
2921
2922       switch (TREE_CODE (arg0))
2923         {
2924         case INDIRECT_REF:
2925           if (!(flags & OEP_ADDRESS_OF)
2926               && (TYPE_ALIGN (TREE_TYPE (arg0))
2927                   != TYPE_ALIGN (TREE_TYPE (arg1))))
2928             return 0;
2929           flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_ADDRESS_OF);
2930           return OP_SAME (0);
2931
2932         case REALPART_EXPR:
2933         case IMAGPART_EXPR:
2934           return OP_SAME (0);
2935
2936         case TARGET_MEM_REF:
2937         case MEM_REF:
2938           /* Require equal access sizes, and similar pointer types.
2939              We can have incomplete types for array references of
2940              variable-sized arrays from the Fortran frontend
2941              though.  Also verify the types are compatible.  */
2942           if (!((TYPE_SIZE (TREE_TYPE (arg0)) == TYPE_SIZE (TREE_TYPE (arg1))
2943                    || (TYPE_SIZE (TREE_TYPE (arg0))
2944                        && TYPE_SIZE (TREE_TYPE (arg1))
2945                        && operand_equal_p (TYPE_SIZE (TREE_TYPE (arg0)),
2946                                            TYPE_SIZE (TREE_TYPE (arg1)), flags)))
2947                   && types_compatible_p (TREE_TYPE (arg0), TREE_TYPE (arg1))
2948                   && ((flags & OEP_ADDRESS_OF)
2949                       || (alias_ptr_types_compatible_p
2950                             (TREE_TYPE (TREE_OPERAND (arg0, 1)),
2951                              TREE_TYPE (TREE_OPERAND (arg1, 1)))
2952                           && (MR_DEPENDENCE_CLIQUE (arg0)
2953                               == MR_DEPENDENCE_CLIQUE (arg1))
2954                           && (MR_DEPENDENCE_BASE (arg0)
2955                               == MR_DEPENDENCE_BASE (arg1))
2956                           && (TYPE_ALIGN (TREE_TYPE (arg0))
2957                             == TYPE_ALIGN (TREE_TYPE (arg1)))))))
2958             return 0;
2959           flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_ADDRESS_OF);
2960           return (OP_SAME (0) && OP_SAME (1)
2961                   /* TARGET_MEM_REF require equal extra operands.  */
2962                   && (TREE_CODE (arg0) != TARGET_MEM_REF
2963                       || (OP_SAME_WITH_NULL (2)
2964                           && OP_SAME_WITH_NULL (3)
2965                           && OP_SAME_WITH_NULL (4))));
2966
2967         case ARRAY_REF:
2968         case ARRAY_RANGE_REF:
2969           /* Operands 2 and 3 may be null.
2970              Compare the array index by value if it is constant first as we
2971              may have different types but same value here.  */
2972           if (!OP_SAME (0))
2973             return 0;
2974           flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_ADDRESS_OF);
2975           return ((tree_int_cst_equal (TREE_OPERAND (arg0, 1),
2976                                        TREE_OPERAND (arg1, 1))
2977                    || OP_SAME (1))
2978                   && OP_SAME_WITH_NULL (2)
2979                   && OP_SAME_WITH_NULL (3));
2980
2981         case COMPONENT_REF:
2982           /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
2983              may be NULL when we're called to compare MEM_EXPRs.  */
2984           if (!OP_SAME_WITH_NULL (0)
2985               || !OP_SAME (1))
2986             return 0;
2987           flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_ADDRESS_OF);
2988           return OP_SAME_WITH_NULL (2);
2989
2990         case BIT_FIELD_REF:
2991           if (!OP_SAME (0))
2992             return 0;
2993           flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_ADDRESS_OF);
2994           return OP_SAME (1) && OP_SAME (2);
2995
2996         default:
2997           return 0;
2998         }
2999
3000     case tcc_expression:
3001       switch (TREE_CODE (arg0))
3002         {
3003         case ADDR_EXPR:
3004           return operand_equal_p (TREE_OPERAND (arg0, 0),
3005                                   TREE_OPERAND (arg1, 0),
3006                                   flags | OEP_ADDRESS_OF);
3007
3008         case TRUTH_NOT_EXPR:
3009           return OP_SAME (0);
3010
3011         case TRUTH_ANDIF_EXPR:
3012         case TRUTH_ORIF_EXPR:
3013           return OP_SAME (0) && OP_SAME (1);
3014
3015         case FMA_EXPR:
3016         case WIDEN_MULT_PLUS_EXPR:
3017         case WIDEN_MULT_MINUS_EXPR:
3018           if (!OP_SAME (2))
3019             return 0;
3020           /* The multiplcation operands are commutative.  */
3021           /* FALLTHRU */
3022
3023         case TRUTH_AND_EXPR:
3024         case TRUTH_OR_EXPR:
3025         case TRUTH_XOR_EXPR:
3026           if (OP_SAME (0) && OP_SAME (1))
3027             return 1;
3028
3029           /* Otherwise take into account this is a commutative operation.  */
3030           return (operand_equal_p (TREE_OPERAND (arg0, 0),
3031                                    TREE_OPERAND (arg1, 1), flags)
3032                   && operand_equal_p (TREE_OPERAND (arg0, 1),
3033                                       TREE_OPERAND (arg1, 0), flags));
3034
3035         case COND_EXPR:
3036         case VEC_COND_EXPR:
3037         case DOT_PROD_EXPR:
3038           return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
3039
3040         default:
3041           return 0;
3042         }
3043
3044     case tcc_vl_exp:
3045       switch (TREE_CODE (arg0))
3046         {
3047         case CALL_EXPR:
3048           if ((CALL_EXPR_FN (arg0) == NULL_TREE)
3049               != (CALL_EXPR_FN (arg1) == NULL_TREE))
3050             /* If not both CALL_EXPRs are either internal or normal function
3051                functions, then they are not equal.  */
3052             return 0;
3053           else if (CALL_EXPR_FN (arg0) == NULL_TREE)
3054             {
3055               /* If the CALL_EXPRs call different internal functions, then they
3056                  are not equal.  */
3057               if (CALL_EXPR_IFN (arg0) != CALL_EXPR_IFN (arg1))
3058                 return 0;
3059             }
3060           else
3061             {
3062               /* If the CALL_EXPRs call different functions, then they are not
3063                  equal.  */
3064               if (! operand_equal_p (CALL_EXPR_FN (arg0), CALL_EXPR_FN (arg1),
3065                                      flags))
3066                 return 0;
3067             }
3068
3069           {
3070             unsigned int cef = call_expr_flags (arg0);
3071             if (flags & OEP_PURE_SAME)
3072               cef &= ECF_CONST | ECF_PURE;
3073             else
3074               cef &= ECF_CONST;
3075             if (!cef)
3076               return 0;
3077           }
3078
3079           /* Now see if all the arguments are the same.  */
3080           {
3081             const_call_expr_arg_iterator iter0, iter1;
3082             const_tree a0, a1;
3083             for (a0 = first_const_call_expr_arg (arg0, &iter0),
3084                    a1 = first_const_call_expr_arg (arg1, &iter1);
3085                  a0 && a1;
3086                  a0 = next_const_call_expr_arg (&iter0),
3087                    a1 = next_const_call_expr_arg (&iter1))
3088               if (! operand_equal_p (a0, a1, flags))
3089                 return 0;
3090
3091             /* If we get here and both argument lists are exhausted
3092                then the CALL_EXPRs are equal.  */
3093             return ! (a0 || a1);
3094           }
3095         default:
3096           return 0;
3097         }
3098
3099     case tcc_declaration:
3100       /* Consider __builtin_sqrt equal to sqrt.  */
3101       return (TREE_CODE (arg0) == FUNCTION_DECL
3102               && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
3103               && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
3104               && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
3105
3106     default:
3107       return 0;
3108     }
3109
3110 #undef OP_SAME
3111 #undef OP_SAME_WITH_NULL
3112 }
3113 \f
3114 /* Similar to operand_equal_p, but see if ARG0 might have been made by
3115    shorten_compare from ARG1 when ARG1 was being compared with OTHER.
3116
3117    When in doubt, return 0.  */
3118
3119 static int
3120 operand_equal_for_comparison_p (tree arg0, tree arg1, tree other)
3121 {
3122   int unsignedp1, unsignedpo;
3123   tree primarg0, primarg1, primother;
3124   unsigned int correct_width;
3125
3126   if (operand_equal_p (arg0, arg1, 0))
3127     return 1;
3128
3129   if (! INTEGRAL_TYPE_P (TREE_TYPE (arg0))
3130       || ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
3131     return 0;
3132
3133   /* Discard any conversions that don't change the modes of ARG0 and ARG1
3134      and see if the inner values are the same.  This removes any
3135      signedness comparison, which doesn't matter here.  */
3136   primarg0 = arg0, primarg1 = arg1;
3137   STRIP_NOPS (primarg0);
3138   STRIP_NOPS (primarg1);
3139   if (operand_equal_p (primarg0, primarg1, 0))
3140     return 1;
3141
3142   /* Duplicate what shorten_compare does to ARG1 and see if that gives the
3143      actual comparison operand, ARG0.
3144
3145      First throw away any conversions to wider types
3146      already present in the operands.  */
3147
3148   primarg1 = get_narrower (arg1, &unsignedp1);
3149   primother = get_narrower (other, &unsignedpo);
3150
3151   correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
3152   if (unsignedp1 == unsignedpo
3153       && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
3154       && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
3155     {
3156       tree type = TREE_TYPE (arg0);
3157
3158       /* Make sure shorter operand is extended the right way
3159          to match the longer operand.  */
3160       primarg1 = fold_convert (signed_or_unsigned_type_for
3161                                (unsignedp1, TREE_TYPE (primarg1)), primarg1);
3162
3163       if (operand_equal_p (arg0, fold_convert (type, primarg1), 0))
3164         return 1;
3165     }
3166
3167   return 0;
3168 }
3169 \f
3170 /* See if ARG is an expression that is either a comparison or is performing
3171    arithmetic on comparisons.  The comparisons must only be comparing
3172    two different values, which will be stored in *CVAL1 and *CVAL2; if
3173    they are nonzero it means that some operands have already been found.
3174    No variables may be used anywhere else in the expression except in the
3175    comparisons.  If SAVE_P is true it means we removed a SAVE_EXPR around
3176    the expression and save_expr needs to be called with CVAL1 and CVAL2.
3177
3178    If this is true, return 1.  Otherwise, return zero.  */
3179
3180 static int
3181 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
3182 {
3183   enum tree_code code = TREE_CODE (arg);
3184   enum tree_code_class tclass = TREE_CODE_CLASS (code);
3185
3186   /* We can handle some of the tcc_expression cases here.  */
3187   if (tclass == tcc_expression && code == TRUTH_NOT_EXPR)
3188     tclass = tcc_unary;
3189   else if (tclass == tcc_expression
3190            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
3191                || code == COMPOUND_EXPR))
3192     tclass = tcc_binary;
3193
3194   else if (tclass == tcc_expression && code == SAVE_EXPR
3195            && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
3196     {
3197       /* If we've already found a CVAL1 or CVAL2, this expression is
3198          two complex to handle.  */
3199       if (*cval1 || *cval2)
3200         return 0;
3201
3202       tclass = tcc_unary;
3203       *save_p = 1;
3204     }
3205
3206   switch (tclass)
3207     {
3208     case tcc_unary:
3209       return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
3210
3211     case tcc_binary:
3212       return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
3213               && twoval_comparison_p (TREE_OPERAND (arg, 1),
3214                                       cval1, cval2, save_p));
3215
3216     case tcc_constant:
3217       return 1;
3218
3219     case tcc_expression:
3220       if (code == COND_EXPR)
3221         return (twoval_comparison_p (TREE_OPERAND (arg, 0),
3222                                      cval1, cval2, save_p)
3223                 && twoval_comparison_p (TREE_OPERAND (arg, 1),
3224                                         cval1, cval2, save_p)
3225                 && twoval_comparison_p (TREE_OPERAND (arg, 2),
3226                                         cval1, cval2, save_p));
3227       return 0;
3228
3229     case tcc_comparison:
3230       /* First see if we can handle the first operand, then the second.  For
3231          the second operand, we know *CVAL1 can't be zero.  It must be that
3232          one side of the comparison is each of the values; test for the
3233          case where this isn't true by failing if the two operands
3234          are the same.  */
3235
3236       if (operand_equal_p (TREE_OPERAND (arg, 0),
3237                            TREE_OPERAND (arg, 1), 0))
3238         return 0;
3239
3240       if (*cval1 == 0)
3241         *cval1 = TREE_OPERAND (arg, 0);
3242       else if (operand_equal_p (*cval1, TREE_OPERAND (arg, 0), 0))
3243         ;
3244       else if (*cval2 == 0)
3245         *cval2 = TREE_OPERAND (arg, 0);
3246       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 0), 0))
3247         ;
3248       else
3249         return 0;
3250
3251       if (operand_equal_p (*cval1, TREE_OPERAND (arg, 1), 0))
3252         ;
3253       else if (*cval2 == 0)
3254         *cval2 = TREE_OPERAND (arg, 1);
3255       else if (operand_equal_p (*cval2, TREE_OPERAND (arg, 1), 0))
3256         ;
3257       else
3258         return 0;
3259
3260       return 1;
3261
3262     default:
3263       return 0;
3264     }
3265 }
3266 \f
3267 /* ARG is a tree that is known to contain just arithmetic operations and
3268    comparisons.  Evaluate the operations in the tree substituting NEW0 for
3269    any occurrence of OLD0 as an operand of a comparison and likewise for
3270    NEW1 and OLD1.  */
3271
3272 static tree
3273 eval_subst (location_t loc, tree arg, tree old0, tree new0,
3274             tree old1, tree new1)
3275 {
3276   tree type = TREE_TYPE (arg);
3277   enum tree_code code = TREE_CODE (arg);
3278   enum tree_code_class tclass = TREE_CODE_CLASS (code);
3279
3280   /* We can handle some of the tcc_expression cases here.  */
3281   if (tclass == tcc_expression && code == TRUTH_NOT_EXPR)
3282     tclass = tcc_unary;
3283   else if (tclass == tcc_expression
3284            && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
3285     tclass = tcc_binary;
3286
3287   switch (tclass)
3288     {
3289     case tcc_unary:
3290       return fold_build1_loc (loc, code, type,
3291                           eval_subst (loc, TREE_OPERAND (arg, 0),
3292                                       old0, new0, old1, new1));
3293
3294     case tcc_binary:
3295       return fold_build2_loc (loc, code, type,
3296                           eval_subst (loc, TREE_OPERAND (arg, 0),
3297                                       old0, new0, old1, new1),
3298                           eval_subst (loc, TREE_OPERAND (arg, 1),
3299                                       old0, new0, old1, new1));
3300
3301     case tcc_expression:
3302       switch (code)
3303         {
3304         case SAVE_EXPR:
3305           return eval_subst (loc, TREE_OPERAND (arg, 0), old0, new0,
3306                              old1, new1);
3307
3308         case COMPOUND_EXPR:
3309           return eval_subst (loc, TREE_OPERAND (arg, 1), old0, new0,
3310                              old1, new1);
3311
3312         case COND_EXPR:
3313           return fold_build3_loc (loc, code, type,
3314                               eval_subst (loc, TREE_OPERAND (arg, 0),
3315                                           old0, new0, old1, new1),
3316                               eval_subst (loc, TREE_OPERAND (arg, 1),
3317                                           old0, new0, old1, new1),
3318                               eval_subst (loc, TREE_OPERAND (arg, 2),
3319                                           old0, new0, old1, new1));
3320         default:
3321           break;
3322         }
3323       /* Fall through - ???  */
3324
3325     case tcc_comparison:
3326       {
3327         tree arg0 = TREE_OPERAND (arg, 0);
3328         tree arg1 = TREE_OPERAND (arg, 1);
3329
3330         /* We need to check both for exact equality and tree equality.  The
3331            former will be true if the operand has a side-effect.  In that
3332            case, we know the operand occurred exactly once.  */
3333
3334         if (arg0 == old0 || operand_equal_p (arg0, old0, 0))
3335           arg0 = new0;
3336         else if (arg0 == old1 || operand_equal_p (arg0, old1, 0))
3337           arg0 = new1;
3338
3339         if (arg1 == old0 || operand_equal_p (arg1, old0, 0))
3340           arg1 = new0;
3341         else if (arg1 == old1 || operand_equal_p (arg1, old1, 0))
3342           arg1 = new1;
3343
3344         return fold_build2_loc (loc, code, type, arg0, arg1);
3345       }
3346
3347     default:
3348       return arg;
3349     }
3350 }
3351 \f
3352 /* Return a tree for the case when the result of an expression is RESULT
3353    converted to TYPE and OMITTED was previously an operand of the expression
3354    but is now not needed (e.g., we folded OMITTED * 0).
3355
3356    If OMITTED has side effects, we must evaluate it.  Otherwise, just do
3357    the conversion of RESULT to TYPE.  */
3358
3359 tree
3360 omit_one_operand_loc (location_t loc, tree type, tree result, tree omitted)
3361 {
3362   tree t = fold_convert_loc (loc, type, result);
3363
3364   /* If the resulting operand is an empty statement, just return the omitted
3365      statement casted to void. */
3366   if (IS_EMPTY_STMT (t) && TREE_SIDE_EFFECTS (omitted))
3367     return build1_loc (loc, NOP_EXPR, void_type_node,
3368                        fold_ignored_result (omitted));
3369
3370   if (TREE_SIDE_EFFECTS (omitted))
3371     return build2_loc (loc, COMPOUND_EXPR, type,
3372                        fold_ignored_result (omitted), t);
3373
3374   return non_lvalue_loc (loc, t);
3375 }
3376
3377 /* Return a tree for the case when the result of an expression is RESULT
3378    converted to TYPE and OMITTED1 and OMITTED2 were previously operands
3379    of the expression but are now not needed.
3380
3381    If OMITTED1 or OMITTED2 has side effects, they must be evaluated.
3382    If both OMITTED1 and OMITTED2 have side effects, OMITTED1 is
3383    evaluated before OMITTED2.  Otherwise, if neither has side effects,
3384    just do the conversion of RESULT to TYPE.  */
3385
3386 tree
3387 omit_two_operands_loc (location_t loc, tree type, tree result,
3388                        tree omitted1, tree omitted2)
3389 {
3390   tree t = fold_convert_loc (loc, type, result);
3391
3392   if (TREE_SIDE_EFFECTS (omitted2))
3393     t = build2_loc (loc, COMPOUND_EXPR, type, omitted2, t);
3394   if (TREE_SIDE_EFFECTS (omitted1))
3395     t = build2_loc (loc, COMPOUND_EXPR, type, omitted1, t);
3396
3397   return TREE_CODE (t) != COMPOUND_EXPR ? non_lvalue_loc (loc, t) : t;
3398 }
3399
3400 \f
3401 /* Return a simplified tree node for the truth-negation of ARG.  This
3402    never alters ARG itself.  We assume that ARG is an operation that
3403    returns a truth value (0 or 1).
3404
3405    FIXME: one would think we would fold the result, but it causes
3406    problems with the dominator optimizer.  */
3407
3408 static tree
3409 fold_truth_not_expr (location_t loc, tree arg)
3410 {
3411   tree type = TREE_TYPE (arg);
3412   enum tree_code code = TREE_CODE (arg);
3413   location_t loc1, loc2;
3414
3415   /* If this is a comparison, we can simply invert it, except for
3416      floating-point non-equality comparisons, in which case we just
3417      enclose a TRUTH_NOT_EXPR around what we have.  */
3418
3419   if (TREE_CODE_CLASS (code) == tcc_comparison)
3420     {
3421       tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
3422       if (FLOAT_TYPE_P (op_type)
3423           && flag_trapping_math
3424           && code != ORDERED_EXPR && code != UNORDERED_EXPR
3425           && code != NE_EXPR && code != EQ_EXPR)
3426         return NULL_TREE;
3427
3428       code = invert_tree_comparison (code, HONOR_NANS (op_type));
3429       if (code == ERROR_MARK)
3430         return NULL_TREE;
3431
3432       return build2_loc (loc, code, type, TREE_OPERAND (arg, 0),
3433                          TREE_OPERAND (arg, 1));
3434     }
3435
3436   switch (code)
3437     {
3438     case INTEGER_CST:
3439       return constant_boolean_node (integer_zerop (arg), type);
3440
3441     case TRUTH_AND_EXPR:
3442       loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3443       loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3444       return build2_loc (loc, TRUTH_OR_EXPR, type,
3445                          invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3446                          invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3447
3448     case TRUTH_OR_EXPR:
3449       loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3450       loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3451       return build2_loc (loc, TRUTH_AND_EXPR, type,
3452                          invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3453                          invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3454
3455     case TRUTH_XOR_EXPR:
3456       /* Here we can invert either operand.  We invert the first operand
3457          unless the second operand is a TRUTH_NOT_EXPR in which case our
3458          result is the XOR of the first operand with the inside of the
3459          negation of the second operand.  */
3460
3461       if (TREE_CODE (TREE_OPERAND (arg, 1)) == TRUTH_NOT_EXPR)
3462         return build2_loc (loc, TRUTH_XOR_EXPR, type, TREE_OPERAND (arg, 0),
3463                            TREE_OPERAND (TREE_OPERAND (arg, 1), 0));
3464       else
3465         return build2_loc (loc, TRUTH_XOR_EXPR, type,
3466                            invert_truthvalue_loc (loc, TREE_OPERAND (arg, 0)),
3467                            TREE_OPERAND (arg, 1));
3468
3469     case TRUTH_ANDIF_EXPR:
3470       loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3471       loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3472       return build2_loc (loc, TRUTH_ORIF_EXPR, type,
3473                          invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3474                          invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3475
3476     case TRUTH_ORIF_EXPR:
3477       loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3478       loc2 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3479       return build2_loc (loc, TRUTH_ANDIF_EXPR, type,
3480                          invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)),
3481                          invert_truthvalue_loc (loc2, TREE_OPERAND (arg, 1)));
3482
3483     case TRUTH_NOT_EXPR:
3484       return TREE_OPERAND (arg, 0);
3485
3486     case COND_EXPR:
3487       {
3488         tree arg1 = TREE_OPERAND (arg, 1);
3489         tree arg2 = TREE_OPERAND (arg, 2);
3490
3491         loc1 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3492         loc2 = expr_location_or (TREE_OPERAND (arg, 2), loc);
3493
3494         /* A COND_EXPR may have a throw as one operand, which
3495            then has void type.  Just leave void operands
3496            as they are.  */
3497         return build3_loc (loc, COND_EXPR, type, TREE_OPERAND (arg, 0),
3498                            VOID_TYPE_P (TREE_TYPE (arg1))
3499                            ? arg1 : invert_truthvalue_loc (loc1, arg1),
3500                            VOID_TYPE_P (TREE_TYPE (arg2))
3501                            ? arg2 : invert_truthvalue_loc (loc2, arg2));
3502       }
3503
3504     case COMPOUND_EXPR:
3505       loc1 = expr_location_or (TREE_OPERAND (arg, 1), loc);
3506       return build2_loc (loc, COMPOUND_EXPR, type,
3507                          TREE_OPERAND (arg, 0),
3508                          invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 1)));
3509
3510     case NON_LVALUE_EXPR:
3511       loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3512       return invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0));
3513
3514     CASE_CONVERT:
3515       if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
3516         return build1_loc (loc, TRUTH_NOT_EXPR, type, arg);
3517
3518       /* ... fall through ...  */
3519
3520     case FLOAT_EXPR:
3521       loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3522       return build1_loc (loc, TREE_CODE (arg), type,
3523                          invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)));
3524
3525     case BIT_AND_EXPR:
3526       if (!integer_onep (TREE_OPERAND (arg, 1)))
3527         return NULL_TREE;
3528       return build2_loc (loc, EQ_EXPR, type, arg, build_int_cst (type, 0));
3529
3530     case SAVE_EXPR:
3531       return build1_loc (loc, TRUTH_NOT_EXPR, type, arg);
3532
3533     case CLEANUP_POINT_EXPR:
3534       loc1 = expr_location_or (TREE_OPERAND (arg, 0), loc);
3535       return build1_loc (loc, CLEANUP_POINT_EXPR, type,
3536                          invert_truthvalue_loc (loc1, TREE_OPERAND (arg, 0)));
3537
3538     default:
3539       return NULL_TREE;
3540     }
3541 }
3542
3543 /* Fold the truth-negation of ARG.  This never alters ARG itself.  We
3544    assume that ARG is an operation that returns a truth value (0 or 1
3545    for scalars, 0 or -1 for vectors).  Return the folded expression if
3546    folding is successful.  Otherwise, return NULL_TREE.  */
3547
3548 static tree
3549 fold_invert_truthvalue (location_t loc, tree arg)
3550 {
3551   tree type = TREE_TYPE (arg);
3552   return fold_unary_loc (loc, VECTOR_TYPE_P (type)
3553                               ? BIT_NOT_EXPR
3554                               : TRUTH_NOT_EXPR,
3555                          type, arg);
3556 }
3557
3558 /* Return a simplified tree node for the truth-negation of ARG.  This
3559    never alters ARG itself.  We assume that ARG is an operation that
3560    returns a truth value (0 or 1 for scalars, 0 or -1 for vectors).  */
3561
3562 tree
3563 invert_truthvalue_loc (location_t loc, tree arg)
3564 {
3565   if (TREE_CODE (arg) == ERROR_MARK)
3566     return arg;
3567
3568   tree type = TREE_TYPE (arg);
3569   return fold_build1_loc (loc, VECTOR_TYPE_P (type)
3570                                ? BIT_NOT_EXPR
3571                                : TRUTH_NOT_EXPR,
3572                           type, arg);
3573 }
3574
3575 /* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both
3576    operands are another bit-wise operation with a common input.  If so,
3577    distribute the bit operations to save an operation and possibly two if
3578    constants are involved.  For example, convert
3579         (A | B) & (A | C) into A | (B & C)
3580    Further simplification will occur if B and C are constants.
3581
3582    If this optimization cannot be done, 0 will be returned.  */
3583
3584 static tree
3585 distribute_bit_expr (location_t loc, enum tree_code code, tree type,
3586                      tree arg0, tree arg1)
3587 {
3588   tree common;
3589   tree left, right;
3590
3591   if (TREE_CODE (arg0) != TREE_CODE (arg1)
3592       || TREE_CODE (arg0) == code
3593       || (TREE_CODE (arg0) != BIT_AND_EXPR
3594           && TREE_CODE (arg0) != BIT_IOR_EXPR))
3595     return 0;
3596
3597   if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0))
3598     {
3599       common = TREE_OPERAND (arg0, 0);
3600       left = TREE_OPERAND (arg0, 1);
3601       right = TREE_OPERAND (arg1, 1);
3602     }
3603   else if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1), 0))
3604     {
3605       common = TREE_OPERAND (arg0, 0);
3606       left = TREE_OPERAND (arg0, 1);
3607       right = TREE_OPERAND (arg1, 0);
3608     }
3609   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 0), 0))
3610     {
3611       common = TREE_OPERAND (arg0, 1);
3612       left = TREE_OPERAND (arg0, 0);
3613       right = TREE_OPERAND (arg1, 1);
3614     }
3615   else if (operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1), 0))
3616     {
3617       common = TREE_OPERAND (arg0, 1);
3618       left = TREE_OPERAND (arg0, 0);
3619       right = TREE_OPERAND (arg1, 0);
3620     }
3621   else
3622     return 0;
3623
3624   common = fold_convert_loc (loc, type, common);
3625   left = fold_convert_loc (loc, type, left);
3626   right = fold_convert_loc (loc, type, right);
3627   return fold_build2_loc (loc, TREE_CODE (arg0), type, common,
3628                       fold_build2_loc (loc, code, type, left, right));
3629 }
3630
3631 /* Knowing that ARG0 and ARG1 are both RDIV_EXPRs, simplify a binary operation
3632    with code CODE.  This optimization is unsafe.  */
3633 static tree
3634 distribute_real_division (location_t loc, enum tree_code code, tree type,
3635                           tree arg0, tree arg1)
3636 {
3637   bool mul0 = TREE_CODE (arg0) == MULT_EXPR;
3638   bool mul1 = TREE_CODE (arg1) == MULT_EXPR;
3639
3640   /* (A / C) +- (B / C) -> (A +- B) / C.  */
3641   if (mul0 == mul1
3642       && operand_equal_p (TREE_OPERAND (arg0, 1),
3643                        TREE_OPERAND (arg1, 1), 0))
3644     return fold_build2_loc (loc, mul0 ? MULT_EXPR : RDIV_EXPR, type,
3645                         fold_build2_loc (loc, code, type,
3646                                      TREE_OPERAND (arg0, 0),
3647                                      TREE_OPERAND (arg1, 0)),
3648                         TREE_OPERAND (arg0, 1));
3649
3650   /* (A / C1) +- (A / C2) -> A * (1 / C1 +- 1 / C2).  */
3651   if (operand_equal_p (TREE_OPERAND (arg0, 0),
3652                        TREE_OPERAND (arg1, 0), 0)
3653       && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
3654       && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
3655     {
3656       REAL_VALUE_TYPE r0, r1;
3657       r0 = TREE_REAL_CST (TREE_OPERAND (arg0, 1));
3658       r1 = TREE_REAL_CST (TREE_OPERAND (arg1, 1));
3659       if (!mul0)
3660         real_arithmetic (&r0, RDIV_EXPR, &dconst1, &r0);
3661       if (!mul1)
3662         real_arithmetic (&r1, RDIV_EXPR, &dconst1, &r1);
3663       real_arithmetic (&r0, code, &r0, &r1);
3664       return fold_build2_loc (loc, MULT_EXPR, type,
3665                           TREE_OPERAND (arg0, 0),
3666                           build_real (type, r0));
3667     }
3668
3669   return NULL_TREE;
3670 }
3671 \f
3672 /* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER
3673    starting at BITPOS.  The field is unsigned if UNSIGNEDP is nonzero.  */
3674
3675 static tree
3676 make_bit_field_ref (location_t loc, tree inner, tree type,
3677                     HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, int unsignedp)
3678 {
3679   tree result, bftype;
3680
3681   if (bitpos == 0)
3682     {
3683       tree size = TYPE_SIZE (TREE_TYPE (inner));
3684       if ((INTEGRAL_TYPE_P (TREE_TYPE (inner))
3685            || POINTER_TYPE_P (TREE_TYPE (inner)))
3686           && tree_fits_shwi_p (size)
3687           && tree_to_shwi (size) == bitsize)
3688         return fold_convert_loc (loc, type, inner);
3689     }
3690
3691   bftype = type;
3692   if (TYPE_PRECISION (bftype) != bitsize
3693       || TYPE_UNSIGNED (bftype) == !unsignedp)
3694     bftype = build_nonstandard_integer_type (bitsize, 0);
3695
3696   result = build3_loc (loc, BIT_FIELD_REF, bftype, inner,
3697                        size_int (bitsize), bitsize_int (bitpos));
3698
3699   if (bftype != type)
3700     result = fold_convert_loc (loc, type, result);
3701
3702   return result;
3703 }
3704
3705 /* Optimize a bit-field compare.
3706
3707    There are two cases:  First is a compare against a constant and the
3708    second is a comparison of two items where the fields are at the same
3709    bit position relative to the start of a chunk (byte, halfword, word)
3710    large enough to contain it.  In these cases we can avoid the shift
3711    implicit in bitfield extractions.
3712
3713    For constants, we emit a compare of the shifted constant with the
3714    BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being
3715    compared.  For two fields at the same position, we do the ANDs with the
3716    similar mask and compare the result of the ANDs.
3717
3718    CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR.
3719    COMPARE_TYPE is the type of the comparison, and LHS and RHS
3720    are the left and right operands of the comparison, respectively.
3721
3722    If the optimization described above can be done, we return the resulting
3723    tree.  Otherwise we return zero.  */
3724
3725 static tree
3726 optimize_bit_field_compare (location_t loc, enum tree_code code,
3727                             tree compare_type, tree lhs, tree rhs)
3728 {
3729   HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize;
3730   tree type = TREE_TYPE (lhs);
3731   tree unsigned_type;
3732   int const_p = TREE_CODE (rhs) == INTEGER_CST;
3733   machine_mode lmode, rmode, nmode;
3734   int lunsignedp, runsignedp;
3735   int lvolatilep = 0, rvolatilep = 0;
3736   tree linner, rinner = NULL_TREE;
3737   tree mask;
3738   tree offset;
3739
3740   /* Get all the information about the extractions being done.  If the bit size
3741      if the same as the size of the underlying object, we aren't doing an
3742      extraction at all and so can do nothing.  We also don't want to
3743      do anything if the inner expression is a PLACEHOLDER_EXPR since we
3744      then will no longer be able to replace it.  */
3745   linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
3746                                 &lunsignedp, &lvolatilep, false);
3747   if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
3748       || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR || lvolatilep)
3749     return 0;
3750
3751  if (!const_p)
3752    {
3753      /* If this is not a constant, we can only do something if bit positions,
3754         sizes, and signedness are the same.  */
3755      rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
3756                                    &runsignedp, &rvolatilep, false);
3757
3758      if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
3759          || lunsignedp != runsignedp || offset != 0
3760          || TREE_CODE (rinner) == PLACEHOLDER_EXPR || rvolatilep)
3761        return 0;
3762    }
3763
3764   /* See if we can find a mode to refer to this field.  We should be able to,
3765      but fail if we can't.  */
3766   nmode = get_best_mode (lbitsize, lbitpos, 0, 0,
3767                          const_p ? TYPE_ALIGN (TREE_TYPE (linner))
3768                          : MIN (TYPE_ALIGN (TREE_TYPE (linner)),
3769                                 TYPE_ALIGN (TREE_TYPE (rinner))),
3770                          word_mode, false);
3771   if (nmode == VOIDmode)
3772     return 0;
3773
3774   /* Set signed and unsigned types of the precision of this mode for the
3775      shifts below.  */
3776   unsigned_type = lang_hooks.types.type_for_mode (nmode, 1);
3777
3778   /* Compute the bit position and size for the new reference and our offset
3779      within it. If the new reference is the same size as the original, we
3780      won't optimize anything, so return zero.  */
3781   nbitsize = GET_MODE_BITSIZE (nmode);
3782   nbitpos = lbitpos & ~ (nbitsize - 1);
3783   lbitpos -= nbitpos;
3784   if (nbitsize == lbitsize)
3785     return 0;
3786
3787   if (BYTES_BIG_ENDIAN)
3788     lbitpos = nbitsize - lbitsize - lbitpos;
3789
3790   /* Make the mask to be used against the extracted field.  */
3791   mask = build_int_cst_type (unsigned_type, -1);
3792   mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize));
3793   mask = const_binop (RSHIFT_EXPR, mask,
3794                       size_int (nbitsize - lbitsize - lbitpos));
3795
3796   if (! const_p)
3797     /* If not comparing with constant, just rework the comparison
3798        and return.  */
3799     return fold_build2_loc (loc, code, compare_type,
3800                         fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
3801                                      make_bit_field_ref (loc, linner,
3802                                                          unsigned_type,
3803                                                          nbitsize, nbitpos,
3804                                                          1),
3805                                      mask),
3806                         fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
3807                                      make_bit_field_ref (loc, rinner,
3808                                                          unsigned_type,
3809                                                          nbitsize, nbitpos,
3810                                                          1),
3811                                      mask));
3812
3813   /* Otherwise, we are handling the constant case. See if the constant is too
3814      big for the field.  Warn and return a tree of for 0 (false) if so.  We do
3815      this not only for its own sake, but to avoid having to test for this
3816      error case below.  If we didn't, we might generate wrong code.
3817
3818      For unsigned fields, the constant shifted right by the field length should
3819      be all zero.  For signed fields, the high-order bits should agree with
3820      the sign bit.  */
3821
3822   if (lunsignedp)
3823     {
3824       if (wi::lrshift (rhs, lbitsize) != 0)
3825         {
3826           warning (0, "comparison is always %d due to width of bit-field",
3827                    code == NE_EXPR);
3828           return constant_boolean_node (code == NE_EXPR, compare_type);
3829         }
3830     }
3831   else
3832     {
3833       wide_int tem = wi::arshift (rhs, lbitsize - 1);
3834       if (tem != 0 && tem != -1)
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
3842   /* Single-bit compares should always be against zero.  */
3843   if (lbitsize == 1 && ! integer_zerop (rhs))
3844     {
3845       code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR;
3846       rhs = build_int_cst (type, 0);
3847     }
3848
3849   /* Make a new bitfield reference, shift the constant over the
3850      appropriate number of bits and mask it with the computed mask
3851      (in case this was a signed field).  If we changed it, make a new one.  */
3852   lhs = make_bit_field_ref (loc, linner, unsigned_type, nbitsize, nbitpos, 1);
3853
3854   rhs = const_binop (BIT_AND_EXPR,
3855                      const_binop (LSHIFT_EXPR,
3856                                   fold_convert_loc (loc, unsigned_type, rhs),
3857                                   size_int (lbitpos)),
3858                      mask);
3859
3860   lhs = build2_loc (loc, code, compare_type,
3861                     build2 (BIT_AND_EXPR, unsigned_type, lhs, mask), rhs);
3862   return lhs;
3863 }
3864 \f
3865 /* Subroutine for fold_truth_andor_1: decode a field reference.
3866
3867    If EXP is a comparison reference, we return the innermost reference.
3868
3869    *PBITSIZE is set to the number of bits in the reference, *PBITPOS is
3870    set to the starting bit number.
3871
3872    If the innermost field can be completely contained in a mode-sized
3873    unit, *PMODE is set to that mode.  Otherwise, it is set to VOIDmode.
3874
3875    *PVOLATILEP is set to 1 if the any expression encountered is volatile;
3876    otherwise it is not changed.
3877
3878    *PUNSIGNEDP is set to the signedness of the field.
3879
3880    *PMASK is set to the mask used.  This is either contained in a
3881    BIT_AND_EXPR or derived from the width of the field.
3882
3883    *PAND_MASK is set to the mask found in a BIT_AND_EXPR, if any.
3884
3885    Return 0 if this is not a component reference or is one that we can't
3886    do anything with.  */
3887
3888 static tree
3889 decode_field_reference (location_t loc, tree exp, HOST_WIDE_INT *pbitsize,
3890                         HOST_WIDE_INT *pbitpos, machine_mode *pmode,
3891                         int *punsignedp, int *pvolatilep,
3892                         tree *pmask, tree *pand_mask)
3893 {
3894   tree outer_type = 0;
3895   tree and_mask = 0;
3896   tree mask, inner, offset;
3897   tree unsigned_type;
3898   unsigned int precision;
3899
3900   /* All the optimizations using this function assume integer fields.
3901      There are problems with FP fields since the type_for_size call
3902      below can fail for, e.g., XFmode.  */
3903   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
3904     return 0;
3905
3906   /* We are interested in the bare arrangement of bits, so strip everything
3907      that doesn't affect the machine mode.  However, record the type of the
3908      outermost expression if it may matter below.  */
3909   if (CONVERT_EXPR_P (exp)
3910       || TREE_CODE (exp) == NON_LVALUE_EXPR)
3911     outer_type = TREE_TYPE (exp);
3912   STRIP_NOPS (exp);
3913
3914   if (TREE_CODE (exp) == BIT_AND_EXPR)
3915     {
3916       and_mask = TREE_OPERAND (exp, 1);
3917       exp = TREE_OPERAND (exp, 0);
3918       STRIP_NOPS (exp); STRIP_NOPS (and_mask);
3919       if (TREE_CODE (and_mask) != INTEGER_CST)
3920         return 0;
3921     }
3922
3923   inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
3924                                punsignedp, pvolatilep, false);
3925   if ((inner == exp && and_mask == 0)
3926       || *pbitsize < 0 || offset != 0
3927       || TREE_CODE (inner) == PLACEHOLDER_EXPR)
3928     return 0;
3929
3930   /* If the number of bits in the reference is the same as the bitsize of
3931      the outer type, then the outer type gives the signedness. Otherwise
3932      (in case of a small bitfield) the signedness is unchanged.  */
3933   if (outer_type && *pbitsize == TYPE_PRECISION (outer_type))
3934     *punsignedp = TYPE_UNSIGNED (outer_type);
3935
3936   /* Compute the mask to access the bitfield.  */
3937   unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
3938   precision = TYPE_PRECISION (unsigned_type);
3939
3940   mask = build_int_cst_type (unsigned_type, -1);
3941
3942   mask = const_binop (LSHIFT_EXPR, mask, size_int (precision - *pbitsize));
3943   mask = const_binop (RSHIFT_EXPR, mask, size_int (precision - *pbitsize));
3944
3945   /* Merge it with the mask we found in the BIT_AND_EXPR, if any.  */
3946   if (and_mask != 0)
3947     mask = fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
3948                         fold_convert_loc (loc, unsigned_type, and_mask), mask);
3949
3950   *pmask = mask;
3951   *pand_mask = and_mask;
3952   return inner;
3953 }
3954
3955 /* Return nonzero if MASK represents a mask of SIZE ones in the low-order
3956    bit positions and MASK is SIGNED.  */
3957
3958 static int
3959 all_ones_mask_p (const_tree mask, unsigned int size)
3960 {
3961   tree type = TREE_TYPE (mask);
3962   unsigned int precision = TYPE_PRECISION (type);
3963
3964   /* If this function returns true when the type of the mask is
3965      UNSIGNED, then there will be errors.  In particular see
3966      gcc.c-torture/execute/990326-1.c.  There does not appear to be
3967      any documentation paper trail as to why this is so.  But the pre
3968      wide-int worked with that restriction and it has been preserved
3969      here.  */
3970   if (size > precision || TYPE_SIGN (type) == UNSIGNED)
3971     return false;
3972
3973   return wi::mask (size, false, precision) == mask;
3974 }
3975
3976 /* Subroutine for fold: determine if VAL is the INTEGER_CONST that
3977    represents the sign bit of EXP's type.  If EXP represents a sign
3978    or zero extension, also test VAL against the unextended type.
3979    The return value is the (sub)expression whose sign bit is VAL,
3980    or NULL_TREE otherwise.  */
3981
3982 tree
3983 sign_bit_p (tree exp, const_tree val)
3984 {
3985   int width;
3986   tree t;
3987
3988   /* Tree EXP must have an integral type.  */
3989   t = TREE_TYPE (exp);
3990   if (! INTEGRAL_TYPE_P (t))
3991     return NULL_TREE;
3992
3993   /* Tree VAL must be an integer constant.  */
3994   if (TREE_CODE (val) != INTEGER_CST
3995       || TREE_OVERFLOW (val))
3996     return NULL_TREE;
3997
3998   width = TYPE_PRECISION (t);
3999   if (wi::only_sign_bit_p (val, width))
4000     return exp;
4001
4002   /* Handle extension from a narrower type.  */
4003   if (TREE_CODE (exp) == NOP_EXPR
4004       && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width)
4005     return sign_bit_p (TREE_OPERAND (exp, 0), val);
4006
4007   return NULL_TREE;
4008 }
4009
4010 /* Subroutine for fold_truth_andor_1: determine if an operand is simple enough
4011    to be evaluated unconditionally.  */
4012
4013 static int
4014 simple_operand_p (const_tree exp)
4015 {
4016   /* Strip any conversions that don't change the machine mode.  */
4017   STRIP_NOPS (exp);
4018
4019   return (CONSTANT_CLASS_P (exp)
4020           || TREE_CODE (exp) == SSA_NAME
4021           || (DECL_P (exp)
4022               && ! TREE_ADDRESSABLE (exp)
4023               && ! TREE_THIS_VOLATILE (exp)
4024               && ! DECL_NONLOCAL (exp)
4025               /* Don't regard global variables as simple.  They may be
4026                  allocated in ways unknown to the compiler (shared memory,
4027                  #pragma weak, etc).  */
4028               && ! TREE_PUBLIC (exp)
4029               && ! DECL_EXTERNAL (exp)
4030               /* Weakrefs are not safe to be read, since they can be NULL.
4031                  They are !TREE_PUBLIC && !DECL_EXTERNAL but still
4032                  have DECL_WEAK flag set.  */
4033               && (! VAR_OR_FUNCTION_DECL_P (exp) || ! DECL_WEAK (exp))
4034               /* Loading a static variable is unduly expensive, but global
4035                  registers aren't expensive.  */
4036               && (! TREE_STATIC (exp) || DECL_REGISTER (exp))));
4037 }
4038
4039 /* Subroutine for fold_truth_andor: determine if an operand is simple enough
4040    to be evaluated unconditionally.
4041    I addition to simple_operand_p, we assume that comparisons, conversions,
4042    and logic-not operations are simple, if their operands are simple, too.  */
4043
4044 static bool
4045 simple_operand_p_2 (tree exp)
4046 {
4047   enum tree_code code;
4048
4049   if (TREE_SIDE_EFFECTS (exp)
4050       || tree_could_trap_p (exp))
4051     return false;
4052
4053   while (CONVERT_EXPR_P (exp))
4054     exp = TREE_OPERAND (exp, 0);
4055
4056   code = TREE_CODE (exp);
4057
4058   if (TREE_CODE_CLASS (code) == tcc_comparison)
4059     return (simple_operand_p (TREE_OPERAND (exp, 0))
4060             && simple_operand_p (TREE_OPERAND (exp, 1)));
4061
4062   if (code == TRUTH_NOT_EXPR)
4063       return simple_operand_p_2 (TREE_OPERAND (exp, 0));
4064
4065   return simple_operand_p (exp);
4066 }
4067
4068 \f
4069 /* The following functions are subroutines to fold_range_test and allow it to
4070    try to change a logical combination of comparisons into a range test.
4071
4072    For example, both
4073         X == 2 || X == 3 || X == 4 || X == 5
4074    and
4075         X >= 2 && X <= 5
4076    are converted to
4077         (unsigned) (X - 2) <= 3
4078
4079    We describe each set of comparisons as being either inside or outside
4080    a range, using a variable named like IN_P, and then describe the
4081    range with a lower and upper bound.  If one of the bounds is omitted,
4082    it represents either the highest or lowest value of the type.
4083
4084    In the comments below, we represent a range by two numbers in brackets
4085    preceded by a "+" to designate being inside that range, or a "-" to
4086    designate being outside that range, so the condition can be inverted by
4087    flipping the prefix.  An omitted bound is represented by a "-".  For
4088    example, "- [-, 10]" means being outside the range starting at the lowest
4089    possible value and ending at 10, in other words, being greater than 10.
4090    The range "+ [-, -]" is always true and hence the range "- [-, -]" is
4091    always false.
4092
4093    We set up things so that the missing bounds are handled in a consistent
4094    manner so neither a missing bound nor "true" and "false" need to be
4095    handled using a special case.  */
4096
4097 /* Return the result of applying CODE to ARG0 and ARG1, but handle the case
4098    of ARG0 and/or ARG1 being omitted, meaning an unlimited range. UPPER0_P
4099    and UPPER1_P are nonzero if the respective argument is an upper bound
4100    and zero for a lower.  TYPE, if nonzero, is the type of the result; it
4101    must be specified for a comparison.  ARG1 will be converted to ARG0's
4102    type if both are specified.  */
4103
4104 static tree
4105 range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
4106              tree arg1, int upper1_p)
4107 {
4108   tree tem;
4109   int result;
4110   int sgn0, sgn1;
4111
4112   /* If neither arg represents infinity, do the normal operation.
4113      Else, if not a comparison, return infinity.  Else handle the special
4114      comparison rules. Note that most of the cases below won't occur, but
4115      are handled for consistency.  */
4116
4117   if (arg0 != 0 && arg1 != 0)
4118     {
4119       tem = fold_build2 (code, type != 0 ? type : TREE_TYPE (arg0),
4120                          arg0, fold_convert (TREE_TYPE (arg0), arg1));
4121       STRIP_NOPS (tem);
4122       return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
4123     }
4124
4125   if (TREE_CODE_CLASS (code) != tcc_comparison)
4126     return 0;
4127
4128   /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
4129      for neither.  In real maths, we cannot assume open ended ranges are
4130      the same. But, this is computer arithmetic, where numbers are finite.
4131      We can therefore make the transformation of any unbounded range with
4132      the value Z, Z being greater than any representable number. This permits
4133      us to treat unbounded ranges as equal.  */
4134   sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
4135   sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
4136   switch (code)
4137     {
4138     case EQ_EXPR:
4139       result = sgn0 == sgn1;
4140       break;
4141     case NE_EXPR:
4142       result = sgn0 != sgn1;
4143       break;
4144     case LT_EXPR:
4145       result = sgn0 < sgn1;
4146       break;
4147     case LE_EXPR:
4148       result = sgn0 <= sgn1;
4149       break;
4150     case GT_EXPR:
4151       result = sgn0 > sgn1;
4152       break;
4153     case GE_EXPR:
4154       result = sgn0 >= sgn1;
4155       break;
4156     default:
4157       gcc_unreachable ();
4158     }
4159
4160   return constant_boolean_node (result, type);
4161 }
4162 \f
4163 /* Helper routine for make_range.  Perform one step for it, return
4164    new expression if the loop should continue or NULL_TREE if it should
4165    stop.  */
4166
4167 tree
4168 make_range_step (location_t loc, enum tree_code code, tree arg0, tree arg1,
4169                  tree exp_type, tree *p_low, tree *p_high, int *p_in_p,
4170                  bool *strict_overflow_p)
4171 {
4172   tree arg0_type = TREE_TYPE (arg0);
4173   tree n_low, n_high, low = *p_low, high = *p_high;
4174   int in_p = *p_in_p, n_in_p;
4175
4176   switch (code)
4177     {
4178     case TRUTH_NOT_EXPR:
4179       /* We can only do something if the range is testing for zero.  */
4180       if (low == NULL_TREE || high == NULL_TREE
4181           || ! integer_zerop (low) || ! integer_zerop (high))
4182         return NULL_TREE;
4183       *p_in_p = ! in_p;
4184       return arg0;
4185
4186     case EQ_EXPR: case NE_EXPR:
4187     case LT_EXPR: case LE_EXPR: case GE_EXPR: case GT_EXPR:
4188       /* We can only do something if the range is testing for zero
4189          and if the second operand is an integer constant.  Note that
4190          saying something is "in" the range we make is done by
4191          complementing IN_P since it will set in the initial case of
4192          being not equal to zero; "out" is leaving it alone.  */
4193       if (low == NULL_TREE || high == NULL_TREE
4194           || ! integer_zerop (low) || ! integer_zerop (high)
4195           || TREE_CODE (arg1) != INTEGER_CST)
4196         return NULL_TREE;
4197
4198       switch (code)
4199         {
4200         case NE_EXPR:  /* - [c, c]  */
4201           low = high = arg1;
4202           break;
4203         case EQ_EXPR:  /* + [c, c]  */
4204           in_p = ! in_p, low = high = arg1;
4205           break;
4206         case GT_EXPR:  /* - [-, c] */
4207           low = 0, high = arg1;
4208           break;
4209         case GE_EXPR:  /* + [c, -] */
4210           in_p = ! in_p, low = arg1, high = 0;
4211           break;
4212         case LT_EXPR:  /* - [c, -] */
4213           low = arg1, high = 0;
4214           break;
4215         case LE_EXPR:  /* + [-, c] */
4216           in_p = ! in_p, low = 0, high = arg1;
4217           break;
4218         default:
4219           gcc_unreachable ();
4220         }
4221
4222       /* If this is an unsigned comparison, we also know that EXP is
4223          greater than or equal to zero.  We base the range tests we make
4224          on that fact, so we record it here so we can parse existing
4225          range tests.  We test arg0_type since often the return type
4226          of, e.g. EQ_EXPR, is boolean.  */
4227       if (TYPE_UNSIGNED (arg0_type) && (low == 0 || high == 0))
4228         {
4229           if (! merge_ranges (&n_in_p, &n_low, &n_high,
4230                               in_p, low, high, 1,
4231                               build_int_cst (arg0_type, 0),
4232                               NULL_TREE))
4233             return NULL_TREE;
4234
4235           in_p = n_in_p, low = n_low, high = n_high;
4236
4237           /* If the high bound is missing, but we have a nonzero low
4238              bound, reverse the range so it goes from zero to the low bound
4239              minus 1.  */
4240           if (high == 0 && low && ! integer_zerop (low))
4241             {
4242               in_p = ! in_p;
4243               high = range_binop (MINUS_EXPR, NULL_TREE, low, 0,
4244                                   build_int_cst (TREE_TYPE (low), 1), 0);
4245               low = build_int_cst (arg0_type, 0);
4246             }
4247         }
4248
4249       *p_low = low;
4250       *p_high = high;
4251       *p_in_p = in_p;
4252       return arg0;
4253
4254     case NEGATE_EXPR:
4255       /* If flag_wrapv and ARG0_TYPE is signed, make sure
4256          low and high are non-NULL, then normalize will DTRT.  */
4257       if (!TYPE_UNSIGNED (arg0_type)
4258           && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4259         {
4260           if (low == NULL_TREE)
4261             low = TYPE_MIN_VALUE (arg0_type);
4262           if (high == NULL_TREE)
4263             high = TYPE_MAX_VALUE (arg0_type);
4264         }
4265
4266       /* (-x) IN [a,b] -> x in [-b, -a]  */
4267       n_low = range_binop (MINUS_EXPR, exp_type,
4268                            build_int_cst (exp_type, 0),
4269                            0, high, 1);
4270       n_high = range_binop (MINUS_EXPR, exp_type,
4271                             build_int_cst (exp_type, 0),
4272                             0, low, 0);
4273       if (n_high != 0 && TREE_OVERFLOW (n_high))
4274         return NULL_TREE;
4275       goto normalize;
4276
4277     case BIT_NOT_EXPR:
4278       /* ~ X -> -X - 1  */
4279       return build2_loc (loc, MINUS_EXPR, exp_type, negate_expr (arg0),
4280                          build_int_cst (exp_type, 1));
4281
4282     case PLUS_EXPR:
4283     case MINUS_EXPR:
4284       if (TREE_CODE (arg1) != INTEGER_CST)
4285         return NULL_TREE;
4286
4287       /* If flag_wrapv and ARG0_TYPE is signed, then we cannot
4288          move a constant to the other side.  */
4289       if (!TYPE_UNSIGNED (arg0_type)
4290           && !TYPE_OVERFLOW_UNDEFINED (arg0_type))
4291         return NULL_TREE;
4292
4293       /* If EXP is signed, any overflow in the computation is undefined,
4294          so we don't worry about it so long as our computations on
4295          the bounds don't overflow.  For unsigned, overflow is defined
4296          and this is exactly the right thing.  */
4297       n_low = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4298                            arg0_type, low, 0, arg1, 0);
4299       n_high = range_binop (code == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR,
4300                             arg0_type, high, 1, arg1, 0);
4301       if ((n_low != 0 && TREE_OVERFLOW (n_low))
4302           || (n_high != 0 && TREE_OVERFLOW (n_high)))
4303         return NULL_TREE;
4304
4305       if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
4306         *strict_overflow_p = true;
4307
4308       normalize:
4309         /* Check for an unsigned range which has wrapped around the maximum
4310            value thus making n_high < n_low, and normalize it.  */
4311         if (n_low && n_high && tree_int_cst_lt (n_high, n_low))
4312           {
4313             low = range_binop (PLUS_EXPR, arg0_type, n_high, 0,
4314                                build_int_cst (TREE_TYPE (n_high), 1), 0);
4315             high = range_binop (MINUS_EXPR, arg0_type, n_low, 0,
4316                                 build_int_cst (TREE_TYPE (n_low), 1), 0);
4317
4318             /* If the range is of the form +/- [ x+1, x ], we won't
4319                be able to normalize it.  But then, it represents the
4320                whole range or the empty set, so make it
4321                +/- [ -, - ].  */
4322             if (tree_int_cst_equal (n_low, low)
4323                 && tree_int_cst_equal (n_high, high))
4324               low = high = 0;
4325             else
4326               in_p = ! in_p;
4327           }
4328         else
4329           low = n_low, high = n_high;
4330
4331         *p_low = low;
4332         *p_high = high;
4333         *p_in_p = in_p;
4334         return arg0;
4335
4336     CASE_CONVERT:
4337     case NON_LVALUE_EXPR:
4338       if (TYPE_PRECISION (arg0_type) > TYPE_PRECISION (exp_type))
4339         return NULL_TREE;
4340
4341       if (! INTEGRAL_TYPE_P (arg0_type)
4342           || (low != 0 && ! int_fits_type_p (low, arg0_type))
4343           || (high != 0 && ! int_fits_type_p (high, arg0_type)))
4344         return NULL_TREE;
4345
4346       n_low = low, n_high = high;
4347
4348       if (n_low != 0)
4349         n_low = fold_convert_loc (loc, arg0_type, n_low);
4350
4351       if (n_high != 0)
4352         n_high = fold_convert_loc (loc, arg0_type, n_high);
4353
4354       /* If we're converting arg0 from an unsigned type, to exp,
4355          a signed type,  we will be doing the comparison as unsigned.
4356          The tests above have already verified that LOW and HIGH
4357          are both positive.
4358
4359          So we have to ensure that we will handle large unsigned
4360          values the same way that the current signed bounds treat
4361          negative values.  */
4362
4363       if (!TYPE_UNSIGNED (exp_type) && TYPE_UNSIGNED (arg0_type))
4364         {
4365           tree high_positive;
4366           tree equiv_type;
4367           /* For fixed-point modes, we need to pass the saturating flag
4368              as the 2nd parameter.  */
4369           if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (arg0_type)))
4370             equiv_type
4371               = lang_hooks.types.type_for_mode (TYPE_MODE (arg0_type),
4372                                                 TYPE_SATURATING (arg0_type));
4373           else
4374             equiv_type
4375               = lang_hooks.types.type_for_mode (TYPE_MODE (arg0_type), 1);
4376
4377           /* A range without an upper bound is, naturally, unbounded.
4378              Since convert would have cropped a very large value, use
4379              the max value for the destination type.  */
4380           high_positive
4381             = TYPE_MAX_VALUE (equiv_type) ? TYPE_MAX_VALUE (equiv_type)
4382               : TYPE_MAX_VALUE (arg0_type);
4383
4384           if (TYPE_PRECISION (exp_type) == TYPE_PRECISION (arg0_type))
4385             high_positive = fold_build2_loc (loc, RSHIFT_EXPR, arg0_type,
4386                                              fold_convert_loc (loc, arg0_type,
4387                                                                high_positive),
4388                                              build_int_cst (arg0_type, 1));
4389
4390           /* If the low bound is specified, "and" the range with the
4391              range for which the original unsigned value will be
4392              positive.  */
4393           if (low != 0)
4394             {
4395               if (! merge_ranges (&n_in_p, &n_low, &n_high, 1, n_low, n_high,
4396                                   1, fold_convert_loc (loc, arg0_type,
4397                                                        integer_zero_node),
4398                                   high_positive))
4399                 return NULL_TREE;
4400
4401               in_p = (n_in_p == in_p);
4402             }
4403           else
4404             {
4405               /* Otherwise, "or" the range with the range of the input
4406                  that will be interpreted as negative.  */
4407               if (! merge_ranges (&n_in_p, &n_low, &n_high, 0, n_low, n_high,
4408                                   1, fold_convert_loc (loc, arg0_type,
4409                                                        integer_zero_node),
4410                                   high_positive))
4411                 return NULL_TREE;
4412
4413               in_p = (in_p != n_in_p);
4414             }
4415         }
4416
4417       *p_low = n_low;
4418       *p_high = n_high;
4419       *p_in_p = in_p;
4420       return arg0;
4421
4422     default:
4423       return NULL_TREE;
4424     }
4425 }
4426
4427 /* Given EXP, a logical expression, set the range it is testing into
4428    variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
4429    actually being tested.  *PLOW and *PHIGH will be made of the same
4430    type as the returned expression.  If EXP is not a comparison, we
4431    will most likely not be returning a useful value and range.  Set
4432    *STRICT_OVERFLOW_P to true if the return value is only valid
4433    because signed overflow is undefined; otherwise, do not change
4434    *STRICT_OVERFLOW_P.  */
4435
4436 tree
4437 make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
4438             bool *strict_overflow_p)
4439 {
4440   enum tree_code code;
4441   tree arg0, arg1 = NULL_TREE;
4442   tree exp_type, nexp;
4443   int in_p;
4444   tree low, high;
4445   location_t loc = EXPR_LOCATION (exp);
4446
4447   /* Start with simply saying "EXP != 0" and then look at the code of EXP
4448      and see if we can refine the range.  Some of the cases below may not
4449      happen, but it doesn't seem worth worrying about this.  We "continue"
4450      the outer loop when we've changed something; otherwise we "break"
4451      the switch, which will "break" the while.  */
4452
4453   in_p = 0;
4454   low = high = build_int_cst (TREE_TYPE (exp), 0);
4455
4456   while (1)
4457     {
4458       code = TREE_CODE (exp);
4459       exp_type = TREE_TYPE (exp);
4460       arg0 = NULL_TREE;
4461
4462       if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
4463         {
4464           if (TREE_OPERAND_LENGTH (exp) > 0)
4465             arg0 = TREE_OPERAND (exp, 0);
4466           if (TREE_CODE_CLASS (code) == tcc_binary
4467               || TREE_CODE_CLASS (code) == tcc_comparison
4468               || (TREE_CODE_CLASS (code) == tcc_expression
4469                   && TREE_OPERAND_LENGTH (exp) > 1))
4470             arg1 = TREE_OPERAND (exp, 1);
4471         }
4472       if (arg0 == NULL_TREE)
4473         break;
4474
4475       nexp = make_range_step (loc, code, arg0, arg1, exp_type, &low,
4476                               &high, &in_p, strict_overflow_p);
4477       if (nexp == NULL_TREE)
4478         break;
4479       exp = nexp;
4480     }
4481
4482   /* If EXP is a constant, we can evaluate whether this is true or false.  */
4483   if (TREE_CODE (exp) == INTEGER_CST)
4484     {
4485       in_p = in_p == (integer_onep (range_binop (GE_EXPR, integer_type_node,
4486                                                  exp, 0, low, 0))
4487                       && integer_onep (range_binop (LE_EXPR, integer_type_node,
4488                                                     exp, 1, high, 1)));
4489       low = high = 0;
4490       exp = 0;
4491     }
4492
4493   *pin_p = in_p, *plow = low, *phigh = high;
4494   return exp;
4495 }
4496 \f
4497 /* Given a range, LOW, HIGH, and IN_P, an expression, EXP, and a result
4498    type, TYPE, return an expression to test if EXP is in (or out of, depending
4499    on IN_P) the range.  Return 0 if the test couldn't be created.  */
4500
4501 tree
4502 build_range_check (location_t loc, tree type, tree exp, int in_p,
4503                    tree low, tree high)
4504 {
4505   tree etype = TREE_TYPE (exp), value;
4506
4507 #ifdef HAVE_canonicalize_funcptr_for_compare
4508   /* Disable this optimization for function pointer expressions
4509      on targets that require function pointer canonicalization.  */
4510   if (HAVE_canonicalize_funcptr_for_compare
4511       && TREE_CODE (etype) == POINTER_TYPE
4512       && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE)
4513     return NULL_TREE;
4514 #endif
4515
4516   if (! in_p)
4517     {
4518       value = build_range_check (loc, type, exp, 1, low, high);
4519       if (value != 0)
4520         return invert_truthvalue_loc (loc, value);
4521
4522       return 0;
4523     }
4524
4525   if (low == 0 && high == 0)
4526     return omit_one_operand_loc (loc, type, build_int_cst (type, 1), exp);
4527
4528   if (low == 0)
4529     return fold_build2_loc (loc, LE_EXPR, type, exp,
4530                         fold_convert_loc (loc, etype, high));
4531
4532   if (high == 0)
4533     return fold_build2_loc (loc, GE_EXPR, type, exp,
4534                         fold_convert_loc (loc, etype, low));
4535
4536   if (operand_equal_p (low, high, 0))
4537     return fold_build2_loc (loc, EQ_EXPR, type, exp,
4538                         fold_convert_loc (loc, etype, low));
4539
4540   if (integer_zerop (low))
4541     {
4542       if (! TYPE_UNSIGNED (etype))
4543         {
4544           etype = unsigned_type_for (etype);
4545           high = fold_convert_loc (loc, etype, high);
4546           exp = fold_convert_loc (loc, etype, exp);
4547         }
4548       return build_range_check (loc, type, exp, 1, 0, high);
4549     }
4550
4551   /* Optimize (c>=1) && (c<=127) into (signed char)c > 0.  */
4552   if (integer_onep (low) && TREE_CODE (high) == INTEGER_CST)
4553     {
4554       int prec = TYPE_PRECISION (etype);
4555
4556       if (wi::mask (prec - 1, false, prec) == high)
4557         {
4558           if (TYPE_UNSIGNED (etype))
4559             {
4560               tree signed_etype = signed_type_for (etype);
4561               if (TYPE_PRECISION (signed_etype) != TYPE_PRECISION (etype))
4562                 etype
4563                   = build_nonstandard_integer_type (TYPE_PRECISION (etype), 0);
4564               else
4565                 etype = signed_etype;
4566               exp = fold_convert_loc (loc, etype, exp);
4567             }
4568           return fold_build2_loc (loc, GT_EXPR, type, exp,
4569                               build_int_cst (etype, 0));
4570         }
4571     }
4572
4573   /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
4574      This requires wrap-around arithmetics for the type of the expression.
4575      First make sure that arithmetics in this type is valid, then make sure
4576      that it wraps around.  */
4577   if (TREE_CODE (etype) == ENUMERAL_TYPE || TREE_CODE (etype) == BOOLEAN_TYPE)
4578     etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
4579                                             TYPE_UNSIGNED (etype));
4580
4581   if (TREE_CODE (etype) == INTEGER_TYPE && !TYPE_OVERFLOW_WRAPS (etype))
4582     {
4583       tree utype, minv, maxv;
4584
4585       /* Check if (unsigned) INT_MAX + 1 == (unsigned) INT_MIN
4586          for the type in question, as we rely on this here.  */
4587       utype = unsigned_type_for (etype);
4588       maxv = fold_convert_loc (loc, utype, TYPE_MAX_VALUE (etype));
4589       maxv = range_binop (PLUS_EXPR, NULL_TREE, maxv, 1,
4590                           build_int_cst (TREE_TYPE (maxv), 1), 1);
4591       minv = fold_convert_loc (loc, utype, TYPE_MIN_VALUE (etype));
4592
4593       if (integer_zerop (range_binop (NE_EXPR, integer_type_node,
4594                                       minv, 1, maxv, 1)))
4595         etype = utype;
4596       else
4597         return 0;
4598     }
4599
4600   high = fold_convert_loc (loc, etype, high);
4601   low = fold_convert_loc (loc, etype, low);
4602   exp = fold_convert_loc (loc, etype, exp);
4603
4604   value = const_binop (MINUS_EXPR, high, low);
4605
4606
4607   if (POINTER_TYPE_P (etype))
4608     {
4609       if (value != 0 && !TREE_OVERFLOW (value))
4610         {
4611           low = fold_build1_loc (loc, NEGATE_EXPR, TREE_TYPE (low), low);
4612           return build_range_check (loc, type,
4613                                     fold_build_pointer_plus_loc (loc, exp, low),
4614                                     1, build_int_cst (etype, 0), value);
4615         }
4616       return 0;
4617     }
4618
4619   if (value != 0 && !TREE_OVERFLOW (value))
4620     return build_range_check (loc, type,
4621                               fold_build2_loc (loc, MINUS_EXPR, etype, exp, low),
4622                               1, build_int_cst (etype, 0), value);
4623
4624   return 0;
4625 }
4626 \f
4627 /* Return the predecessor of VAL in its type, handling the infinite case.  */
4628
4629 static tree
4630 range_predecessor (tree val)
4631 {
4632   tree type = TREE_TYPE (val);
4633
4634   if (INTEGRAL_TYPE_P (type)
4635       && operand_equal_p (val, TYPE_MIN_VALUE (type), 0))
4636     return 0;
4637   else
4638     return range_binop (MINUS_EXPR, NULL_TREE, val, 0,
4639                         build_int_cst (TREE_TYPE (val), 1), 0);
4640 }
4641
4642 /* Return the successor of VAL in its type, handling the infinite case.  */
4643
4644 static tree
4645 range_successor (tree val)
4646 {
4647   tree type = TREE_TYPE (val);
4648
4649   if (INTEGRAL_TYPE_P (type)
4650       && operand_equal_p (val, TYPE_MAX_VALUE (type), 0))
4651     return 0;
4652   else
4653     return range_binop (PLUS_EXPR, NULL_TREE, val, 0,
4654                         build_int_cst (TREE_TYPE (val), 1), 0);
4655 }
4656
4657 /* Given two ranges, see if we can merge them into one.  Return 1 if we
4658    can, 0 if we can't.  Set the output range into the specified parameters.  */
4659
4660 bool
4661 merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
4662               tree high0, int in1_p, tree low1, tree high1)
4663 {
4664   int no_overlap;
4665   int subset;
4666   int temp;
4667   tree tem;
4668   int in_p;
4669   tree low, high;
4670   int lowequal = ((low0 == 0 && low1 == 0)
4671                   || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4672                                                 low0, 0, low1, 0)));
4673   int highequal = ((high0 == 0 && high1 == 0)
4674                    || integer_onep (range_binop (EQ_EXPR, integer_type_node,
4675                                                  high0, 1, high1, 1)));
4676
4677   /* Make range 0 be the range that starts first, or ends last if they
4678      start at the same value.  Swap them if it isn't.  */
4679   if (integer_onep (range_binop (GT_EXPR, integer_type_node,
4680                                  low0, 0, low1, 0))
4681       || (lowequal
4682           && integer_onep (range_binop (GT_EXPR, integer_type_node,
4683                                         high1, 1, high0, 1))))
4684     {
4685       temp = in0_p, in0_p = in1_p, in1_p = temp;
4686       tem = low0, low0 = low1, low1 = tem;
4687       tem = high0, high0 = high1, high1 = tem;
4688     }
4689
4690   /* Now flag two cases, whether the ranges are disjoint or whether the
4691      second range is totally subsumed in the first.  Note that the tests
4692      below are simplified by the ones above.  */
4693   no_overlap = integer_onep (range_binop (LT_EXPR, integer_type_node,
4694                                           high0, 1, low1, 0));
4695   subset = integer_onep (range_binop (LE_EXPR, integer_type_node,
4696                                       high1, 1, high0, 1));
4697
4698   /* We now have four cases, depending on whether we are including or
4699      excluding the two ranges.  */
4700   if (in0_p && in1_p)
4701     {
4702       /* If they don't overlap, the result is false.  If the second range
4703          is a subset it is the result.  Otherwise, the range is from the start
4704          of the second to the end of the first.  */
4705       if (no_overlap)
4706         in_p = 0, low = high = 0;
4707       else if (subset)
4708         in_p = 1, low = low1, high = high1;
4709       else
4710         in_p = 1, low = low1, high = high0;
4711     }
4712
4713   else if (in0_p && ! in1_p)
4714     {
4715       /* If they don't overlap, the result is the first range.  If they are
4716          equal, the result is false.  If the second range is a subset of the
4717          first, and the ranges begin at the same place, we go from just after
4718          the end of the second range to the end of the first.  If the second
4719          range is not a subset of the first, or if it is a subset and both
4720          ranges end at the same place, the range starts at the start of the
4721          first range and ends just before the second range.
4722          Otherwise, we can't describe this as a single range.  */
4723       if (no_overlap)
4724         in_p = 1, low = low0, high = high0;
4725       else if (lowequal && highequal)
4726         in_p = 0, low = high = 0;
4727       else if (subset && lowequal)
4728         {
4729           low = range_successor (high1);
4730           high = high0;
4731           in_p = 1;
4732           if (low == 0)
4733             {
4734               /* We are in the weird situation where high0 > high1 but
4735                  high1 has no successor.  Punt.  */
4736               return 0;
4737             }
4738         }
4739       else if (! subset || highequal)
4740         {
4741           low = low0;
4742           high = range_predecessor (low1);
4743           in_p = 1;
4744           if (high == 0)
4745             {
4746               /* low0 < low1 but low1 has no predecessor.  Punt.  */
4747               return 0;
4748             }
4749         }
4750       else
4751         return 0;
4752     }
4753
4754   else if (! in0_p && in1_p)
4755     {
4756       /* If they don't overlap, the result is the second range.  If the second
4757          is a subset of the first, the result is false.  Otherwise,
4758          the range starts just after the first range and ends at the
4759          end of the second.  */
4760       if (no_overlap)
4761         in_p = 1, low = low1, high = high1;
4762       else if (subset || highequal)
4763         in_p = 0, low = high = 0;
4764       else
4765         {
4766           low = range_successor (high0);
4767           high = high1;
4768           in_p = 1;
4769           if (low == 0)
4770             {
4771               /* high1 > high0 but high0 has no successor.  Punt.  */
4772               return 0;
4773             }
4774         }
4775     }
4776
4777   else
4778     {
4779       /* The case where we are excluding both ranges.  Here the complex case
4780          is if they don't overlap.  In that case, the only time we have a
4781          range is if they are adjacent.  If the second is a subset of the
4782          first, the result is the first.  Otherwise, the range to exclude
4783          starts at the beginning of the first range and ends at the end of the
4784          second.  */
4785       if (no_overlap)
4786         {
4787           if (integer_onep (range_binop (EQ_EXPR, integer_type_node,
4788                                          range_successor (high0),
4789                                          1, low1, 0)))
4790             in_p = 0, low = low0, high = high1;
4791           else
4792             {
4793               /* Canonicalize - [min, x] into - [-, x].  */
4794               if (low0 && TREE_CODE (low0) == INTEGER_CST)
4795                 switch (TREE_CODE (TREE_TYPE (low0)))
4796                   {
4797                   case ENUMERAL_TYPE:
4798                     if (TYPE_PRECISION (TREE_TYPE (low0))
4799                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (low0))))
4800                       break;
4801                     /* FALLTHROUGH */
4802                   case INTEGER_TYPE:
4803                     if (tree_int_cst_equal (low0,
4804                                             TYPE_MIN_VALUE (TREE_TYPE (low0))))
4805                       low0 = 0;
4806                     break;
4807                   case POINTER_TYPE:
4808                     if (TYPE_UNSIGNED (TREE_TYPE (low0))
4809                         && integer_zerop (low0))
4810                       low0 = 0;
4811                     break;
4812                   default:
4813                     break;
4814                   }
4815
4816               /* Canonicalize - [x, max] into - [x, -].  */
4817               if (high1 && TREE_CODE (high1) == INTEGER_CST)
4818                 switch (TREE_CODE (TREE_TYPE (high1)))
4819                   {
4820                   case ENUMERAL_TYPE:
4821                     if (TYPE_PRECISION (TREE_TYPE (high1))
4822                         != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (high1))))
4823                       break;
4824                     /* FALLTHROUGH */
4825                   case INTEGER_TYPE:
4826                     if (tree_int_cst_equal (high1,
4827                                             TYPE_MAX_VALUE (TREE_TYPE (high1))))
4828                       high1 = 0;
4829                     break;
4830                   case POINTER_TYPE:
4831                     if (TYPE_UNSIGNED (TREE_TYPE (high1))
4832                         && integer_zerop (range_binop (PLUS_EXPR, NULL_TREE,
4833                                                        high1, 1,
4834                                                        build_int_cst (TREE_TYPE (high1), 1),
4835                                                        1)))
4836                       high1 = 0;
4837                     break;
4838                   default:
4839                     break;
4840                   }
4841
4842               /* The ranges might be also adjacent between the maximum and
4843                  minimum values of the given type.  For
4844                  - [{min,-}, x] and - [y, {max,-}] ranges where x + 1 < y
4845                  return + [x + 1, y - 1].  */
4846               if (low0 == 0 && high1 == 0)
4847                 {
4848                   low = range_successor (high0);
4849                   high = range_predecessor (low1);
4850                   if (low == 0 || high == 0)
4851                     return 0;
4852
4853                   in_p = 1;
4854                 }
4855               else
4856                 return 0;
4857             }
4858         }
4859       else if (subset)
4860         in_p = 0, low = low0, high = high0;
4861       else
4862         in_p = 0, low = low0, high = high1;
4863     }
4864
4865   *pin_p = in_p, *plow = low, *phigh = high;
4866   return 1;
4867 }
4868 \f
4869
4870 /* Subroutine of fold, looking inside expressions of the form
4871    A op B ? A : C, where ARG0, ARG1 and ARG2 are the three operands
4872    of the COND_EXPR.  This function is being used also to optimize
4873    A op B ? C : A, by reversing the comparison first.
4874
4875    Return a folded expression whose code is not a COND_EXPR
4876    anymore, or NULL_TREE if no folding opportunity is found.  */
4877
4878 static tree
4879 fold_cond_expr_with_comparison (location_t loc, tree type,
4880                                 tree arg0, tree arg1, tree arg2)
4881 {
4882   enum tree_code comp_code = TREE_CODE (arg0);
4883   tree arg00 = TREE_OPERAND (arg0, 0);
4884   tree arg01 = TREE_OPERAND (arg0, 1);
4885   tree arg1_type = TREE_TYPE (arg1);
4886   tree tem;
4887
4888   STRIP_NOPS (arg1);
4889   STRIP_NOPS (arg2);
4890
4891   /* If we have A op 0 ? A : -A, consider applying the following
4892      transformations:
4893
4894      A == 0? A : -A    same as -A
4895      A != 0? A : -A    same as A
4896      A >= 0? A : -A    same as abs (A)
4897      A > 0?  A : -A    same as abs (A)
4898      A <= 0? A : -A    same as -abs (A)
4899      A < 0?  A : -A    same as -abs (A)
4900
4901      None of these transformations work for modes with signed
4902      zeros.  If A is +/-0, the first two transformations will
4903      change the sign of the result (from +0 to -0, or vice
4904      versa).  The last four will fix the sign of the result,
4905      even though the original expressions could be positive or
4906      negative, depending on the sign of A.
4907
4908      Note that all these transformations are correct if A is
4909      NaN, since the two alternatives (A and -A) are also NaNs.  */
4910   if (!HONOR_SIGNED_ZEROS (element_mode (type))
4911       && (FLOAT_TYPE_P (TREE_TYPE (arg01))
4912           ? real_zerop (arg01)
4913           : integer_zerop (arg01))
4914       && ((TREE_CODE (arg2) == NEGATE_EXPR
4915            && operand_equal_p (TREE_OPERAND (arg2, 0), arg1, 0))
4916              /* In the case that A is of the form X-Y, '-A' (arg2) may
4917                 have already been folded to Y-X, check for that. */
4918           || (TREE_CODE (arg1) == MINUS_EXPR
4919               && TREE_CODE (arg2) == MINUS_EXPR
4920               && operand_equal_p (TREE_OPERAND (arg1, 0),
4921                                   TREE_OPERAND (arg2, 1), 0)
4922               && operand_equal_p (TREE_OPERAND (arg1, 1),
4923                                   TREE_OPERAND (arg2, 0), 0))))
4924     switch (comp_code)
4925       {
4926       case EQ_EXPR:
4927       case UNEQ_EXPR:
4928         tem = fold_convert_loc (loc, arg1_type, arg1);
4929         return pedantic_non_lvalue_loc (loc,
4930                                     fold_convert_loc (loc, type,
4931                                                   negate_expr (tem)));
4932       case NE_EXPR:
4933       case LTGT_EXPR:
4934         return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
4935       case UNGE_EXPR:
4936       case UNGT_EXPR:
4937         if (flag_trapping_math)
4938           break;
4939         /* Fall through.  */
4940       case GE_EXPR:
4941       case GT_EXPR:
4942         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4943           arg1 = fold_convert_loc (loc, signed_type_for
4944                                (TREE_TYPE (arg1)), arg1);
4945         tem = fold_build1_loc (loc, ABS_EXPR, TREE_TYPE (arg1), arg1);
4946         return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
4947       case UNLE_EXPR:
4948       case UNLT_EXPR:
4949         if (flag_trapping_math)
4950           break;
4951       case LE_EXPR:
4952       case LT_EXPR:
4953         if (TYPE_UNSIGNED (TREE_TYPE (arg1)))
4954           arg1 = fold_convert_loc (loc, signed_type_for
4955                                (TREE_TYPE (arg1)), arg1);
4956         tem = fold_build1_loc (loc, ABS_EXPR, TREE_TYPE (arg1), arg1);
4957         return negate_expr (fold_convert_loc (loc, type, tem));
4958       default:
4959         gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
4960         break;
4961       }
4962
4963   /* A != 0 ? A : 0 is simply A, unless A is -0.  Likewise
4964      A == 0 ? A : 0 is always 0 unless A is -0.  Note that
4965      both transformations are correct when A is NaN: A != 0
4966      is then true, and A == 0 is false.  */
4967
4968   if (!HONOR_SIGNED_ZEROS (element_mode (type))
4969       && integer_zerop (arg01) && integer_zerop (arg2))
4970     {
4971       if (comp_code == NE_EXPR)
4972         return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
4973       else if (comp_code == EQ_EXPR)
4974         return build_zero_cst (type);
4975     }
4976
4977   /* Try some transformations of A op B ? A : B.
4978
4979      A == B? A : B    same as B
4980      A != B? A : B    same as A
4981      A >= B? A : B    same as max (A, B)
4982      A > B?  A : B    same as max (B, A)
4983      A <= B? A : B    same as min (A, B)
4984      A < B?  A : B    same as min (B, A)
4985
4986      As above, these transformations don't work in the presence
4987      of signed zeros.  For example, if A and B are zeros of
4988      opposite sign, the first two transformations will change
4989      the sign of the result.  In the last four, the original
4990      expressions give different results for (A=+0, B=-0) and
4991      (A=-0, B=+0), but the transformed expressions do not.
4992
4993      The first two transformations are correct if either A or B
4994      is a NaN.  In the first transformation, the condition will
4995      be false, and B will indeed be chosen.  In the case of the
4996      second transformation, the condition A != B will be true,
4997      and A will be chosen.
4998
4999      The conversions to max() and min() are not correct if B is
5000      a number and A is not.  The conditions in the original
5001      expressions will be false, so all four give B.  The min()
5002      and max() versions would give a NaN instead.  */
5003   if (!HONOR_SIGNED_ZEROS (element_mode (type))
5004       && operand_equal_for_comparison_p (arg01, arg2, arg00)
5005       /* Avoid these transformations if the COND_EXPR may be used
5006          as an lvalue in the C++ front-end.  PR c++/19199.  */
5007       && (in_gimple_form
5008           || VECTOR_TYPE_P (type)
5009           || (! lang_GNU_CXX ()
5010               && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
5011           || ! maybe_lvalue_p (arg1)
5012           || ! maybe_lvalue_p (arg2)))
5013     {
5014       tree comp_op0 = arg00;
5015       tree comp_op1 = arg01;
5016       tree comp_type = TREE_TYPE (comp_op0);
5017
5018       /* Avoid adding NOP_EXPRs in case this is an lvalue.  */
5019       if (TYPE_MAIN_VARIANT (comp_type) == TYPE_MAIN_VARIANT (type))
5020         {
5021           comp_type = type;
5022           comp_op0 = arg1;
5023           comp_op1 = arg2;
5024         }
5025
5026       switch (comp_code)
5027         {
5028         case EQ_EXPR:
5029           return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg2));
5030         case NE_EXPR:
5031           return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
5032         case LE_EXPR:
5033         case LT_EXPR:
5034         case UNLE_EXPR:
5035         case UNLT_EXPR:
5036           /* In C++ a ?: expression can be an lvalue, so put the
5037              operand which will be used if they are equal first
5038              so that we can convert this back to the
5039              corresponding COND_EXPR.  */
5040           if (!HONOR_NANS (arg1))
5041             {
5042               comp_op0 = fold_convert_loc (loc, comp_type, comp_op0);
5043               comp_op1 = fold_convert_loc (loc, comp_type, comp_op1);
5044               tem = (comp_code == LE_EXPR || comp_code == UNLE_EXPR)
5045                     ? fold_build2_loc (loc, MIN_EXPR, comp_type, comp_op0, comp_op1)
5046                     : fold_build2_loc (loc, MIN_EXPR, comp_type,
5047                                    comp_op1, comp_op0);
5048               return pedantic_non_lvalue_loc (loc,
5049                                           fold_convert_loc (loc, type, tem));
5050             }
5051           break;
5052         case GE_EXPR:
5053         case GT_EXPR:
5054         case UNGE_EXPR:
5055         case UNGT_EXPR:
5056           if (!HONOR_NANS (arg1))
5057             {
5058               comp_op0 = fold_convert_loc (loc, comp_type, comp_op0);
5059               comp_op1 = fold_convert_loc (loc, comp_type, comp_op1);
5060               tem = (comp_code == GE_EXPR || comp_code == UNGE_EXPR)
5061                     ? fold_build2_loc (loc, MAX_EXPR, comp_type, comp_op0, comp_op1)
5062                     : fold_build2_loc (loc, MAX_EXPR, comp_type,
5063                                    comp_op1, comp_op0);
5064               return pedantic_non_lvalue_loc (loc,
5065                                           fold_convert_loc (loc, type, tem));
5066             }
5067           break;
5068         case UNEQ_EXPR:
5069           if (!HONOR_NANS (arg1))
5070             return pedantic_non_lvalue_loc (loc,
5071                                         fold_convert_loc (loc, type, arg2));
5072           break;
5073         case LTGT_EXPR:
5074           if (!HONOR_NANS (arg1))
5075             return pedantic_non_lvalue_loc (loc,
5076                                         fold_convert_loc (loc, type, arg1));
5077           break;
5078         default:
5079           gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
5080           break;
5081         }
5082     }
5083
5084   /* If this is A op C1 ? A : C2 with C1 and C2 constant integers,
5085      we might still be able to simplify this.  For example,
5086      if C1 is one less or one more than C2, this might have started
5087      out as a MIN or MAX and been transformed by this function.
5088      Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE.  */
5089
5090   if (INTEGRAL_TYPE_P (type)
5091       && TREE_CODE (arg01) == INTEGER_CST
5092       && TREE_CODE (arg2) == INTEGER_CST)
5093     switch (comp_code)
5094       {
5095       case EQ_EXPR:
5096         if (TREE_CODE (arg1) == INTEGER_CST)
5097           break;
5098         /* We can replace A with C1 in this case.  */
5099         arg1 = fold_convert_loc (loc, type, arg01);
5100         return fold_build3_loc (loc, COND_EXPR, type, arg0, arg1, arg2);
5101
5102       case LT_EXPR:
5103         /* If C1 is C2 + 1, this is min(A, C2), but use ARG00's type for
5104            MIN_EXPR, to preserve the signedness of the comparison.  */
5105         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5106                                OEP_ONLY_CONST)
5107             && operand_equal_p (arg01,
5108                                 const_binop (PLUS_EXPR, arg2,
5109                                              build_int_cst (type, 1)),
5110                                 OEP_ONLY_CONST))
5111           {
5112             tem = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (arg00), arg00,
5113                                    fold_convert_loc (loc, TREE_TYPE (arg00),
5114                                                      arg2));
5115             return pedantic_non_lvalue_loc (loc,
5116                                             fold_convert_loc (loc, type, tem));
5117           }
5118         break;
5119
5120       case LE_EXPR:
5121         /* If C1 is C2 - 1, this is min(A, C2), with the same care
5122            as above.  */
5123         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5124                                OEP_ONLY_CONST)
5125             && operand_equal_p (arg01,
5126                                 const_binop (MINUS_EXPR, arg2,
5127                                              build_int_cst (type, 1)),
5128                                 OEP_ONLY_CONST))
5129           {
5130             tem = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (arg00), arg00,
5131                                    fold_convert_loc (loc, TREE_TYPE (arg00),
5132                                                      arg2));
5133             return pedantic_non_lvalue_loc (loc,
5134                                             fold_convert_loc (loc, type, tem));
5135           }
5136         break;
5137
5138       case GT_EXPR:
5139         /* If C1 is C2 - 1, this is max(A, C2), but use ARG00's type for
5140            MAX_EXPR, to preserve the signedness of the comparison.  */
5141         if (! operand_equal_p (arg2, TYPE_MIN_VALUE (type),
5142                                OEP_ONLY_CONST)
5143             && operand_equal_p (arg01,
5144                                 const_binop (MINUS_EXPR, arg2,
5145                                              build_int_cst (type, 1)),
5146                                 OEP_ONLY_CONST))
5147           {
5148             tem = fold_build2_loc (loc, MAX_EXPR, TREE_TYPE (arg00), arg00,
5149                                    fold_convert_loc (loc, TREE_TYPE (arg00),
5150                                                      arg2));
5151             return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
5152           }
5153         break;
5154
5155       case GE_EXPR:
5156         /* If C1 is C2 + 1, this is max(A, C2), with the same care as above.  */
5157         if (! operand_equal_p (arg2, TYPE_MAX_VALUE (type),
5158                                OEP_ONLY_CONST)
5159             && operand_equal_p (arg01,
5160                                 const_binop (PLUS_EXPR, arg2,
5161                                              build_int_cst (type, 1)),
5162                                 OEP_ONLY_CONST))
5163           {
5164             tem = fold_build2_loc (loc, MAX_EXPR, TREE_TYPE (arg00), arg00,
5165                                    fold_convert_loc (loc, TREE_TYPE (arg00),
5166                                                      arg2));
5167             return pedantic_non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
5168           }
5169         break;
5170       case NE_EXPR:
5171         break;
5172       default:
5173         gcc_unreachable ();
5174       }
5175
5176   return NULL_TREE;
5177 }
5178
5179
5180 \f
5181 #ifndef LOGICAL_OP_NON_SHORT_CIRCUIT
5182 #define LOGICAL_OP_NON_SHORT_CIRCUIT \
5183   (BRANCH_COST (optimize_function_for_speed_p (cfun), \
5184                 false) >= 2)
5185 #endif
5186
5187 /* EXP is some logical combination of boolean tests.  See if we can
5188    merge it into some range test.  Return the new tree if so.  */
5189
5190 static tree
5191 fold_range_test (location_t loc, enum tree_code code, tree type,
5192                  tree op0, tree op1)
5193 {
5194   int or_op = (code == TRUTH_ORIF_EXPR
5195                || code == TRUTH_OR_EXPR);
5196   int in0_p, in1_p, in_p;
5197   tree low0, low1, low, high0, high1, high;
5198   bool strict_overflow_p = false;
5199   tree tem, lhs, rhs;
5200   const char * const warnmsg = G_("assuming signed overflow does not occur "
5201                                   "when simplifying range test");
5202
5203   if (!INTEGRAL_TYPE_P (type))
5204     return 0;
5205
5206   lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
5207   rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
5208
5209   /* If this is an OR operation, invert both sides; we will invert
5210      again at the end.  */
5211   if (or_op)
5212     in0_p = ! in0_p, in1_p = ! in1_p;
5213
5214   /* If both expressions are the same, if we can merge the ranges, and we
5215      can build the range test, return it or it inverted.  If one of the
5216      ranges is always true or always false, consider it to be the same
5217      expression as the other.  */
5218   if ((lhs == 0 || rhs == 0 || operand_equal_p (lhs, rhs, 0))
5219       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
5220                        in1_p, low1, high1)
5221       && 0 != (tem = (build_range_check (loc, type,
5222                                          lhs != 0 ? lhs
5223                                          : rhs != 0 ? rhs : integer_zero_node,
5224                                          in_p, low, high))))
5225     {
5226       if (strict_overflow_p)
5227         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
5228       return or_op ? invert_truthvalue_loc (loc, tem) : tem;
5229     }
5230
5231   /* On machines where the branch cost is expensive, if this is a
5232      short-circuited branch and the underlying object on both sides
5233      is the same, make a non-short-circuit operation.  */
5234   else if (LOGICAL_OP_NON_SHORT_CIRCUIT
5235            && lhs != 0 && rhs != 0
5236            && (code == TRUTH_ANDIF_EXPR
5237                || code == TRUTH_ORIF_EXPR)
5238            && operand_equal_p (lhs, rhs, 0))
5239     {
5240       /* If simple enough, just rewrite.  Otherwise, make a SAVE_EXPR
5241          unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in
5242          which cases we can't do this.  */
5243       if (simple_operand_p (lhs))
5244         return build2_loc (loc, code == TRUTH_ANDIF_EXPR
5245                            ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5246                            type, op0, op1);
5247
5248       else if (!lang_hooks.decls.global_bindings_p ()
5249                && !CONTAINS_PLACEHOLDER_P (lhs))
5250         {
5251           tree common = save_expr (lhs);
5252
5253           if (0 != (lhs = build_range_check (loc, type, common,
5254                                              or_op ? ! in0_p : in0_p,
5255                                              low0, high0))
5256               && (0 != (rhs = build_range_check (loc, type, common,
5257                                                  or_op ? ! in1_p : in1_p,
5258                                                  low1, high1))))
5259             {
5260               if (strict_overflow_p)
5261                 fold_overflow_warning (warnmsg,
5262                                        WARN_STRICT_OVERFLOW_COMPARISON);
5263               return build2_loc (loc, code == TRUTH_ANDIF_EXPR
5264                                  ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
5265                                  type, lhs, rhs);
5266             }
5267         }
5268     }
5269
5270   return 0;
5271 }
5272 \f
5273 /* Subroutine for fold_truth_andor_1: C is an INTEGER_CST interpreted as a P
5274    bit value.  Arrange things so the extra bits will be set to zero if and
5275    only if C is signed-extended to its full width.  If MASK is nonzero,
5276    it is an INTEGER_CST that should be AND'ed with the extra bits.  */
5277
5278 static tree
5279 unextend (tree c, int p, int unsignedp, tree mask)
5280 {
5281   tree type = TREE_TYPE (c);
5282   int modesize = GET_MODE_BITSIZE (TYPE_MODE (type));
5283   tree temp;
5284
5285   if (p == modesize || unsignedp)
5286     return c;
5287
5288   /* We work by getting just the sign bit into the low-order bit, then
5289      into the high-order bit, then sign-extend.  We then XOR that value
5290      with C.  */
5291   temp = build_int_cst (TREE_TYPE (c), wi::extract_uhwi (c, p - 1, 1));
5292
5293   /* We must use a signed type in order to get an arithmetic right shift.
5294      However, we must also avoid introducing accidental overflows, so that
5295      a subsequent call to integer_zerop will work.  Hence we must
5296      do the type conversion here.  At this point, the constant is either
5297      zero or one, and the conversion to a signed type can never overflow.
5298      We could get an overflow if this conversion is done anywhere else.  */
5299   if (TYPE_UNSIGNED (type))
5300     temp = fold_convert (signed_type_for (type), temp);
5301
5302   temp = const_binop (LSHIFT_EXPR, temp, size_int (modesize - 1));
5303   temp = const_binop (RSHIFT_EXPR, temp, size_int (modesize - p - 1));
5304   if (mask != 0)
5305     temp = const_binop (BIT_AND_EXPR, temp,
5306                         fold_convert (TREE_TYPE (c), mask));
5307   /* If necessary, convert the type back to match the type of C.  */
5308   if (TYPE_UNSIGNED (type))
5309     temp = fold_convert (type, temp);
5310
5311   return fold_convert (type, const_binop (BIT_XOR_EXPR, c, temp));
5312 }
5313 \f
5314 /* For an expression that has the form
5315      (A && B) || ~B
5316    or
5317      (A || B) && ~B,
5318    we can drop one of the inner expressions and simplify to
5319      A || ~B
5320    or
5321      A && ~B
5322    LOC is the location of the resulting expression.  OP is the inner 
5323    logical operation; the left-hand side in the examples above, while CMPOP
5324    is the right-hand side.  RHS_ONLY is used to prevent us from accidentally
5325    removing a condition that guards another, as in
5326      (A != NULL && A->...) || A == NULL
5327    which we must not transform.  If RHS_ONLY is true, only eliminate the
5328    right-most operand of the inner logical operation.  */
5329
5330 static tree
5331 merge_truthop_with_opposite_arm (location_t loc, tree op, tree cmpop,
5332                                  bool rhs_only)
5333 {
5334   tree type = TREE_TYPE (cmpop);
5335   enum tree_code code = TREE_CODE (cmpop);
5336   enum tree_code truthop_code = TREE_CODE (op);
5337   tree lhs = TREE_OPERAND (op, 0);
5338   tree rhs = TREE_OPERAND (op, 1);
5339   tree orig_lhs = lhs, orig_rhs = rhs;
5340   enum tree_code rhs_code = TREE_CODE (rhs);
5341   enum tree_code lhs_code = TREE_CODE (lhs);
5342   enum tree_code inv_code;
5343
5344   if (TREE_SIDE_EFFECTS (op) || TREE_SIDE_EFFECTS (cmpop))
5345     return NULL_TREE;
5346
5347   if (TREE_CODE_CLASS (code) != tcc_comparison)
5348     return NULL_TREE;
5349
5350   if (rhs_code == truthop_code)
5351     {
5352       tree newrhs = merge_truthop_with_opposite_arm (loc, rhs, cmpop, rhs_only);
5353       if (newrhs != NULL_TREE)
5354         {
5355           rhs = newrhs;
5356           rhs_code = TREE_CODE (rhs);
5357         }
5358     }
5359   if (lhs_code == truthop_code && !rhs_only)
5360     {
5361       tree newlhs = merge_truthop_with_opposite_arm (loc, lhs, cmpop, false);
5362       if (newlhs != NULL_TREE)
5363         {
5364           lhs = newlhs;
5365           lhs_code = TREE_CODE (lhs);
5366         }
5367     }
5368
5369   inv_code = invert_tree_comparison (code, HONOR_NANS (type));
5370   if (inv_code == rhs_code
5371       && operand_equal_p (TREE_OPERAND (rhs, 0), TREE_OPERAND (cmpop, 0), 0)
5372       && operand_equal_p (TREE_OPERAND (rhs, 1), TREE_OPERAND (cmpop, 1), 0))
5373     return lhs;
5374   if (!rhs_only && inv_code == lhs_code
5375       && operand_equal_p (TREE_OPERAND (lhs, 0), TREE_OPERAND (cmpop, 0), 0)
5376       && operand_equal_p (TREE_OPERAND (lhs, 1), TREE_OPERAND (cmpop, 1), 0))
5377     return rhs;
5378   if (rhs != orig_rhs || lhs != orig_lhs)
5379     return fold_build2_loc (loc, truthop_code, TREE_TYPE (cmpop),
5380                             lhs, rhs);
5381   return NULL_TREE;
5382 }
5383
5384 /* Find ways of folding logical expressions of LHS and RHS:
5385    Try to merge two comparisons to the same innermost item.
5386    Look for range tests like "ch >= '0' && ch <= '9'".
5387    Look for combinations of simple terms on machines with expensive branches
5388    and evaluate the RHS unconditionally.
5389
5390    For example, if we have p->a == 2 && p->b == 4 and we can make an
5391    object large enough to span both A and B, we can do this with a comparison
5392    against the object ANDed with the a mask.
5393
5394    If we have p->a == q->a && p->b == q->b, we may be able to use bit masking
5395    operations to do this with one comparison.
5396
5397    We check for both normal comparisons and the BIT_AND_EXPRs made this by
5398    function and the one above.
5399
5400    CODE is the logical operation being done.  It can be TRUTH_ANDIF_EXPR,
5401    TRUTH_AND_EXPR, TRUTH_ORIF_EXPR, or TRUTH_OR_EXPR.
5402
5403    TRUTH_TYPE is the type of the logical operand and LHS and RHS are its
5404    two operands.
5405
5406    We return the simplified tree or 0 if no optimization is possible.  */
5407
5408 static tree
5409 fold_truth_andor_1 (location_t loc, enum tree_code code, tree truth_type,
5410                     tree lhs, tree rhs)
5411 {
5412   /* If this is the "or" of two comparisons, we can do something if
5413      the comparisons are NE_EXPR.  If this is the "and", we can do something
5414      if the comparisons are EQ_EXPR.  I.e.,
5415         (a->b == 2 && a->c == 4) can become (a->new == NEW).
5416
5417      WANTED_CODE is this operation code.  For single bit fields, we can
5418      convert EQ_EXPR to NE_EXPR so we need not reject the "wrong"
5419      comparison for one-bit fields.  */
5420
5421   enum tree_code wanted_code;
5422   enum tree_code lcode, rcode;
5423   tree ll_arg, lr_arg, rl_arg, rr_arg;
5424   tree ll_inner, lr_inner, rl_inner, rr_inner;
5425   HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos;
5426   HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos;
5427   HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos;
5428   HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos;
5429   int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp;
5430   machine_mode ll_mode, lr_mode, rl_mode, rr_mode;
5431   machine_mode lnmode, rnmode;
5432   tree ll_mask, lr_mask, rl_mask, rr_mask;
5433   tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask;
5434   tree l_const, r_const;
5435   tree lntype, rntype, result;
5436   HOST_WIDE_INT first_bit, end_bit;
5437   int volatilep;
5438
5439   /* Start by getting the comparison codes.  Fail if anything is volatile.
5440      If one operand is a BIT_AND_EXPR with the constant one, treat it as if
5441      it were surrounded with a NE_EXPR.  */
5442
5443   if (TREE_SIDE_EFFECTS (lhs) || TREE_SIDE_EFFECTS (rhs))
5444     return 0;
5445
5446   lcode = TREE_CODE (lhs);
5447   rcode = TREE_CODE (rhs);
5448
5449   if (lcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (lhs, 1)))
5450     {
5451       lhs = build2 (NE_EXPR, truth_type, lhs,
5452                     build_int_cst (TREE_TYPE (lhs), 0));
5453       lcode = NE_EXPR;
5454     }
5455
5456   if (rcode == BIT_AND_EXPR && integer_onep (TREE_OPERAND (rhs, 1)))
5457     {
5458       rhs = build2 (NE_EXPR, truth_type, rhs,
5459                     build_int_cst (TREE_TYPE (rhs), 0));
5460       rcode = NE_EXPR;
5461     }
5462
5463   if (TREE_CODE_CLASS (lcode) != tcc_comparison
5464       || TREE_CODE_CLASS (rcode) != tcc_comparison)
5465     return 0;
5466
5467   ll_arg = TREE_OPERAND (lhs, 0);
5468   lr_arg = TREE_OPERAND (lhs, 1);
5469   rl_arg = TREE_OPERAND (rhs, 0);
5470   rr_arg = TREE_OPERAND (rhs, 1);
5471
5472   /* Simplify (x<y) && (x==y) into (x<=y) and related optimizations.  */
5473   if (simple_operand_p (ll_arg)
5474       && simple_operand_p (lr_arg))
5475     {
5476       if (operand_equal_p (ll_arg, rl_arg, 0)
5477           && operand_equal_p (lr_arg, rr_arg, 0))
5478         {
5479           result = combine_comparisons (loc, code, lcode, rcode,
5480                                         truth_type, ll_arg, lr_arg);
5481           if (result)
5482             return result;
5483         }
5484       else if (operand_equal_p (ll_arg, rr_arg, 0)
5485                && operand_equal_p (lr_arg, rl_arg, 0))
5486         {
5487           result = combine_comparisons (loc, code, lcode,
5488                                         swap_tree_comparison (rcode),
5489                                         truth_type, ll_arg, lr_arg);
5490           if (result)
5491             return result;
5492         }
5493     }
5494
5495   code = ((code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR)
5496           ? TRUTH_AND_EXPR : TRUTH_OR_EXPR);
5497
5498   /* If the RHS can be evaluated unconditionally and its operands are
5499      simple, it wins to evaluate the RHS unconditionally on machines
5500      with expensive branches.  In this case, this isn't a comparison
5501      that can be merged.  */
5502
5503   if (BRANCH_COST (optimize_function_for_speed_p (cfun),
5504                    false) >= 2
5505       && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg))
5506       && simple_operand_p (rl_arg)
5507       && simple_operand_p (rr_arg))
5508     {
5509       /* Convert (a != 0) || (b != 0) into (a | b) != 0.  */
5510       if (code == TRUTH_OR_EXPR
5511           && lcode == NE_EXPR && integer_zerop (lr_arg)
5512           && rcode == NE_EXPR && integer_zerop (rr_arg)
5513           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5514           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5515         return build2_loc (loc, NE_EXPR, truth_type,
5516                            build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5517                                    ll_arg, rl_arg),
5518                            build_int_cst (TREE_TYPE (ll_arg), 0));
5519
5520       /* Convert (a == 0) && (b == 0) into (a | b) == 0.  */
5521       if (code == TRUTH_AND_EXPR
5522           && lcode == EQ_EXPR && integer_zerop (lr_arg)
5523           && rcode == EQ_EXPR && integer_zerop (rr_arg)
5524           && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)
5525           && INTEGRAL_TYPE_P (TREE_TYPE (ll_arg)))
5526         return build2_loc (loc, EQ_EXPR, truth_type,
5527                            build2 (BIT_IOR_EXPR, TREE_TYPE (ll_arg),
5528                                    ll_arg, rl_arg),
5529                            build_int_cst (TREE_TYPE (ll_arg), 0));
5530     }
5531
5532   /* See if the comparisons can be merged.  Then get all the parameters for
5533      each side.  */
5534
5535   if ((lcode != EQ_EXPR && lcode != NE_EXPR)
5536       || (rcode != EQ_EXPR && rcode != NE_EXPR))
5537     return 0;
5538
5539   volatilep = 0;
5540   ll_inner = decode_field_reference (loc, ll_arg,
5541                                      &ll_bitsize, &ll_bitpos, &ll_mode,
5542                                      &ll_unsignedp, &volatilep, &ll_mask,
5543                                      &ll_and_mask);
5544   lr_inner = decode_field_reference (loc, lr_arg,
5545                                      &lr_bitsize, &lr_bitpos, &lr_mode,
5546                                      &lr_unsignedp, &volatilep, &lr_mask,
5547                                      &lr_and_mask);
5548   rl_inner = decode_field_reference (loc, rl_arg,
5549                                      &rl_bitsize, &rl_bitpos, &rl_mode,
5550                                      &rl_unsignedp, &volatilep, &rl_mask,
5551                                      &rl_and_mask);
5552   rr_inner = decode_field_reference (loc, rr_arg,
5553                                      &rr_bitsize, &rr_bitpos, &rr_mode,
5554                                      &rr_unsignedp, &volatilep, &rr_mask,
5555                                      &rr_and_mask);
5556
5557   /* It must be true that the inner operation on the lhs of each
5558      comparison must be the same if we are to be able to do anything.
5559      Then see if we have constants.  If not, the same must be true for
5560      the rhs's.  */
5561   if (volatilep || ll_inner == 0 || rl_inner == 0
5562       || ! operand_equal_p (ll_inner, rl_inner, 0))
5563     return 0;
5564
5565   if (TREE_CODE (lr_arg) == INTEGER_CST
5566       && TREE_CODE (rr_arg) == INTEGER_CST)
5567     l_const = lr_arg, r_const = rr_arg;
5568   else if (lr_inner == 0 || rr_inner == 0
5569            || ! operand_equal_p (lr_inner, rr_inner, 0))
5570     return 0;
5571   else
5572     l_const = r_const = 0;
5573
5574   /* If either comparison code is not correct for our logical operation,
5575      fail.  However, we can convert a one-bit comparison against zero into
5576      the opposite comparison against that bit being set in the field.  */
5577
5578   wanted_code = (code == TRUTH_AND_EXPR ? EQ_EXPR : NE_EXPR);
5579   if (lcode != wanted_code)
5580     {
5581       if (l_const && integer_zerop (l_const) && integer_pow2p (ll_mask))
5582         {
5583           /* Make the left operand unsigned, since we are only interested
5584              in the value of one bit.  Otherwise we are doing the wrong
5585              thing below.  */
5586           ll_unsignedp = 1;
5587           l_const = ll_mask;
5588         }
5589       else
5590         return 0;
5591     }
5592
5593   /* This is analogous to the code for l_const above.  */
5594   if (rcode != wanted_code)
5595     {
5596       if (r_const && integer_zerop (r_const) && integer_pow2p (rl_mask))
5597         {
5598           rl_unsignedp = 1;
5599           r_const = rl_mask;
5600         }
5601       else
5602         return 0;
5603     }
5604
5605   /* See if we can find a mode that contains both fields being compared on
5606      the left.  If we can't, fail.  Otherwise, update all constants and masks
5607      to be relative to a field of that size.  */
5608   first_bit = MIN (ll_bitpos, rl_bitpos);
5609   end_bit = MAX (ll_bitpos + ll_bitsize, rl_bitpos + rl_bitsize);
5610   lnmode = get_best_mode (end_bit - first_bit, first_bit, 0, 0,
5611                           TYPE_ALIGN (TREE_TYPE (ll_inner)), word_mode,
5612                           volatilep);
5613   if (lnmode == VOIDmode)
5614     return 0;
5615
5616   lnbitsize = GET_MODE_BITSIZE (lnmode);
5617   lnbitpos = first_bit & ~ (lnbitsize - 1);
5618   lntype = lang_hooks.types.type_for_size (lnbitsize, 1);
5619   xll_bitpos = ll_bitpos - lnbitpos, xrl_bitpos = rl_bitpos - lnbitpos;
5620
5621   if (BYTES_BIG_ENDIAN)
5622     {
5623       xll_bitpos = lnbitsize - xll_bitpos - ll_bitsize;
5624       xrl_bitpos = lnbitsize - xrl_bitpos - rl_bitsize;
5625     }
5626
5627   ll_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, lntype, ll_mask),
5628                          size_int (xll_bitpos));
5629   rl_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc, lntype, rl_mask),
5630                          size_int (xrl_bitpos));
5631
5632   if (l_const)
5633     {
5634       l_const = fold_convert_loc (loc, lntype, l_const);
5635       l_const = unextend (l_const, ll_bitsize, ll_unsignedp, ll_and_mask);
5636       l_const = const_binop (LSHIFT_EXPR, l_const, size_int (xll_bitpos));
5637       if (! integer_zerop (const_binop (BIT_AND_EXPR, l_const,
5638                                         fold_build1_loc (loc, BIT_NOT_EXPR,
5639                                                      lntype, ll_mask))))
5640         {
5641           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5642
5643           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5644         }
5645     }
5646   if (r_const)
5647     {
5648       r_const = fold_convert_loc (loc, lntype, r_const);
5649       r_const = unextend (r_const, rl_bitsize, rl_unsignedp, rl_and_mask);
5650       r_const = const_binop (LSHIFT_EXPR, r_const, size_int (xrl_bitpos));
5651       if (! integer_zerop (const_binop (BIT_AND_EXPR, r_const,
5652                                         fold_build1_loc (loc, BIT_NOT_EXPR,
5653                                                      lntype, rl_mask))))
5654         {
5655           warning (0, "comparison is always %d", wanted_code == NE_EXPR);
5656
5657           return constant_boolean_node (wanted_code == NE_EXPR, truth_type);
5658         }
5659     }
5660
5661   /* If the right sides are not constant, do the same for it.  Also,
5662      disallow this optimization if a size or signedness mismatch occurs
5663      between the left and right sides.  */
5664   if (l_const == 0)
5665     {
5666       if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize
5667           || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp
5668           /* Make sure the two fields on the right
5669              correspond to the left without being swapped.  */
5670           || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos)
5671         return 0;
5672
5673       first_bit = MIN (lr_bitpos, rr_bitpos);
5674       end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize);
5675       rnmode = get_best_mode (end_bit - first_bit, first_bit, 0, 0,
5676                               TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode,
5677                               volatilep);
5678       if (rnmode == VOIDmode)
5679         return 0;
5680
5681       rnbitsize = GET_MODE_BITSIZE (rnmode);
5682       rnbitpos = first_bit & ~ (rnbitsize - 1);
5683       rntype = lang_hooks.types.type_for_size (rnbitsize, 1);
5684       xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos;
5685
5686       if (BYTES_BIG_ENDIAN)
5687         {
5688           xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize;
5689           xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize;
5690         }
5691
5692       lr_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc,
5693                                                             rntype, lr_mask),
5694                              size_int (xlr_bitpos));
5695       rr_mask = const_binop (LSHIFT_EXPR, fold_convert_loc (loc,
5696                                                             rntype, rr_mask),
5697                              size_int (xrr_bitpos));
5698
5699       /* Make a mask that corresponds to both fields being compared.
5700          Do this for both items being compared.  If the operands are the
5701          same size and the bits being compared are in the same position
5702          then we can do this by masking both and comparing the masked
5703          results.  */
5704       ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask);
5705       lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask);
5706       if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
5707         {
5708           lhs = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos,
5709                                     ll_unsignedp || rl_unsignedp);
5710           if (! all_ones_mask_p (ll_mask, lnbitsize))
5711             lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask);
5712
5713           rhs = make_bit_field_ref (loc, lr_inner, rntype, rnbitsize, rnbitpos,
5714                                     lr_unsignedp || rr_unsignedp);
5715           if (! all_ones_mask_p (lr_mask, rnbitsize))
5716             rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask);
5717
5718           return build2_loc (loc, wanted_code, truth_type, lhs, rhs);
5719         }
5720
5721       /* There is still another way we can do something:  If both pairs of
5722          fields being compared are adjacent, we may be able to make a wider
5723          field containing them both.
5724
5725          Note that we still must mask the lhs/rhs expressions.  Furthermore,
5726          the mask must be shifted to account for the shift done by
5727          make_bit_field_ref.  */
5728       if ((ll_bitsize + ll_bitpos == rl_bitpos
5729            && lr_bitsize + lr_bitpos == rr_bitpos)
5730           || (ll_bitpos == rl_bitpos + rl_bitsize
5731               && lr_bitpos == rr_bitpos + rr_bitsize))
5732         {
5733           tree type;
5734
5735           lhs = make_bit_field_ref (loc, ll_inner, lntype,
5736                                     ll_bitsize + rl_bitsize,
5737                                     MIN (ll_bitpos, rl_bitpos), ll_unsignedp);
5738           rhs = make_bit_field_ref (loc, lr_inner, rntype,
5739                                     lr_bitsize + rr_bitsize,
5740                                     MIN (lr_bitpos, rr_bitpos), lr_unsignedp);
5741
5742           ll_mask = const_binop (RSHIFT_EXPR, ll_mask,
5743                                  size_int (MIN (xll_bitpos, xrl_bitpos)));
5744           lr_mask = const_binop (RSHIFT_EXPR, lr_mask,
5745                                  size_int (MIN (xlr_bitpos, xrr_bitpos)));
5746
5747           /* Convert to the smaller type before masking out unwanted bits.  */
5748           type = lntype;
5749           if (lntype != rntype)
5750             {
5751               if (lnbitsize > rnbitsize)
5752                 {
5753                   lhs = fold_convert_loc (loc, rntype, lhs);
5754                   ll_mask = fold_convert_loc (loc, rntype, ll_mask);
5755                   type = rntype;
5756                 }
5757               else if (lnbitsize < rnbitsize)
5758                 {
5759                   rhs = fold_convert_loc (loc, lntype, rhs);
5760                   lr_mask = fold_convert_loc (loc, lntype, lr_mask);
5761                   type = lntype;
5762                 }
5763             }
5764
5765           if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize))
5766             lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask);
5767
5768           if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize))
5769             rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask);
5770
5771           return build2_loc (loc, wanted_code, truth_type, lhs, rhs);
5772         }
5773
5774       return 0;
5775     }
5776
5777   /* Handle the case of comparisons with constants.  If there is something in
5778      common between the masks, those bits of the constants must be the same.
5779      If not, the condition is always false.  Test for this to avoid generating
5780      incorrect code below.  */
5781   result = const_binop (BIT_AND_EXPR, ll_mask, rl_mask);
5782   if (! integer_zerop (result)
5783       && simple_cst_equal (const_binop (BIT_AND_EXPR, result, l_const),
5784                            const_binop (BIT_AND_EXPR, result, r_const)) != 1)
5785     {
5786       if (wanted_code == NE_EXPR)
5787         {
5788           warning (0, "%<or%> of unmatched not-equal tests is always 1");
5789           return constant_boolean_node (true, truth_type);
5790         }
5791       else
5792         {
5793           warning (0, "%<and%> of mutually exclusive equal-tests is always 0");
5794           return constant_boolean_node (false, truth_type);
5795         }
5796     }
5797
5798   /* Construct the expression we will return.  First get the component
5799      reference we will make.  Unless the mask is all ones the width of
5800      that field, perform the mask operation.  Then compare with the
5801      merged constant.  */
5802   result = make_bit_field_ref (loc, ll_inner, lntype, lnbitsize, lnbitpos,
5803                                ll_unsignedp || rl_unsignedp);
5804
5805   ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask);
5806   if (! all_ones_mask_p (ll_mask, lnbitsize))
5807     result = build2_loc (loc, BIT_AND_EXPR, lntype, result, ll_mask);
5808
5809   return build2_loc (loc, wanted_code, truth_type, result,
5810                      const_binop (BIT_IOR_EXPR, l_const, r_const));
5811 }
5812 \f
5813 /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a
5814    constant.  */
5815
5816 static tree
5817 optimize_minmax_comparison (location_t loc, enum tree_code code, tree type,
5818                             tree op0, tree op1)
5819 {
5820   tree arg0 = op0;
5821   enum tree_code op_code;
5822   tree comp_const;
5823   tree minmax_const;
5824   int consts_equal, consts_lt;
5825   tree inner;
5826
5827   STRIP_SIGN_NOPS (arg0);
5828
5829   op_code = TREE_CODE (arg0);
5830   minmax_const = TREE_OPERAND (arg0, 1);
5831   comp_const = fold_convert_loc (loc, TREE_TYPE (arg0), op1);
5832   consts_equal = tree_int_cst_equal (minmax_const, comp_const);
5833   consts_lt = tree_int_cst_lt (minmax_const, comp_const);
5834   inner = TREE_OPERAND (arg0, 0);
5835
5836   /* If something does not permit us to optimize, return the original tree.  */
5837   if ((op_code != MIN_EXPR && op_code != MAX_EXPR)
5838       || TREE_CODE (comp_const) != INTEGER_CST
5839       || TREE_OVERFLOW (comp_const)
5840       || TREE_CODE (minmax_const) != INTEGER_CST
5841       || TREE_OVERFLOW (minmax_const))
5842     return NULL_TREE;
5843
5844   /* Now handle all the various comparison codes.  We only handle EQ_EXPR
5845      and GT_EXPR, doing the rest with recursive calls using logical
5846      simplifications.  */
5847   switch (code)
5848     {
5849     case NE_EXPR:  case LT_EXPR:  case LE_EXPR:
5850       {
5851         tree tem
5852           = optimize_minmax_comparison (loc,
5853                                         invert_tree_comparison (code, false),
5854                                         type, op0, op1);
5855         if (tem)
5856           return invert_truthvalue_loc (loc, tem);
5857         return NULL_TREE;
5858       }
5859
5860     case GE_EXPR:
5861       return
5862         fold_build2_loc (loc, TRUTH_ORIF_EXPR, type,
5863                      optimize_minmax_comparison
5864                      (loc, EQ_EXPR, type, arg0, comp_const),
5865                      optimize_minmax_comparison
5866                      (loc, GT_EXPR, type, arg0, comp_const));
5867
5868     case EQ_EXPR:
5869       if (op_code == MAX_EXPR && consts_equal)
5870         /* MAX (X, 0) == 0  ->  X <= 0  */
5871         return fold_build2_loc (loc, LE_EXPR, type, inner, comp_const);
5872
5873       else if (op_code == MAX_EXPR && consts_lt)
5874         /* MAX (X, 0) == 5  ->  X == 5   */
5875         return fold_build2_loc (loc, EQ_EXPR, type, inner, comp_const);
5876
5877       else if (op_code == MAX_EXPR)
5878         /* MAX (X, 0) == -1  ->  false  */
5879         return omit_one_operand_loc (loc, type, integer_zero_node, inner);
5880
5881       else if (consts_equal)
5882         /* MIN (X, 0) == 0  ->  X >= 0  */
5883         return fold_build2_loc (loc, GE_EXPR, type, inner, comp_const);
5884
5885       else if (consts_lt)
5886         /* MIN (X, 0) == 5  ->  false  */
5887         return omit_one_operand_loc (loc, type, integer_zero_node, inner);
5888
5889       else
5890         /* MIN (X, 0) == -1  ->  X == -1  */
5891         return fold_build2_loc (loc, EQ_EXPR, type, inner, comp_const);
5892
5893     case GT_EXPR:
5894       if (op_code == MAX_EXPR && (consts_equal || consts_lt))
5895         /* MAX (X, 0) > 0  ->  X > 0
5896            MAX (X, 0) > 5  ->  X > 5  */
5897         return fold_build2_loc (loc, GT_EXPR, type, inner, comp_const);
5898
5899       else if (op_code == MAX_EXPR)
5900         /* MAX (X, 0) > -1  ->  true  */
5901         return omit_one_operand_loc (loc, type, integer_one_node, inner);
5902
5903       else if (op_code == MIN_EXPR && (consts_equal || consts_lt))
5904         /* MIN (X, 0) > 0  ->  false
5905            MIN (X, 0) > 5  ->  false  */
5906         return omit_one_operand_loc (loc, type, integer_zero_node, inner);
5907
5908       else
5909         /* MIN (X, 0) > -1  ->  X > -1  */
5910         return fold_build2_loc (loc, GT_EXPR, type, inner, comp_const);
5911
5912     default:
5913       return NULL_TREE;
5914     }
5915 }
5916 \f
5917 /* T is an integer expression that is being multiplied, divided, or taken a
5918    modulus (CODE says which and what kind of divide or modulus) by a
5919    constant C.  See if we can eliminate that operation by folding it with
5920    other operations already in T.  WIDE_TYPE, if non-null, is a type that
5921    should be used for the computation if wider than our type.
5922
5923    For example, if we are dividing (X * 8) + (Y * 16) by 4, we can return
5924    (X * 2) + (Y * 4).  We must, however, be assured that either the original
5925    expression would not overflow or that overflow is undefined for the type
5926    in the language in question.
5927
5928    If we return a non-null expression, it is an equivalent form of the
5929    original computation, but need not be in the original type.
5930
5931    We set *STRICT_OVERFLOW_P to true if the return values depends on
5932    signed overflow being undefined.  Otherwise we do not change
5933    *STRICT_OVERFLOW_P.  */
5934
5935 static tree
5936 extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
5937                 bool *strict_overflow_p)
5938 {
5939   /* To avoid exponential search depth, refuse to allow recursion past
5940      three levels.  Beyond that (1) it's highly unlikely that we'll find
5941      something interesting and (2) we've probably processed it before
5942      when we built the inner expression.  */
5943
5944   static int depth;
5945   tree ret;
5946
5947   if (depth > 3)
5948     return NULL;
5949
5950   depth++;
5951   ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
5952   depth--;
5953
5954   return ret;
5955 }
5956
5957 static tree
5958 extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
5959                   bool *strict_overflow_p)
5960 {
5961   tree type = TREE_TYPE (t);
5962   enum tree_code tcode = TREE_CODE (t);
5963   tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
5964                                    > GET_MODE_SIZE (TYPE_MODE (type)))
5965                 ? wide_type : type);
5966   tree t1, t2;
5967   int same_p = tcode == code;
5968   tree op0 = NULL_TREE, op1 = NULL_TREE;
5969   bool sub_strict_overflow_p;
5970
5971   /* Don't deal with constants of zero here; they confuse the code below.  */
5972   if (integer_zerop (c))
5973     return NULL_TREE;
5974
5975   if (TREE_CODE_CLASS (tcode) == tcc_unary)
5976     op0 = TREE_OPERAND (t, 0);
5977
5978   if (TREE_CODE_CLASS (tcode) == tcc_binary)
5979     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
5980
5981   /* Note that we need not handle conditional operations here since fold
5982      already handles those cases.  So just do arithmetic here.  */
5983   switch (tcode)
5984     {
5985     case INTEGER_CST:
5986       /* For a constant, we can always simplify if we are a multiply
5987          or (for divide and modulus) if it is a multiple of our constant.  */
5988       if (code == MULT_EXPR
5989           || wi::multiple_of_p (t, c, TYPE_SIGN (type)))
5990         return const_binop (code, fold_convert (ctype, t),
5991                             fold_convert (ctype, c));
5992       break;
5993
5994     CASE_CONVERT: case NON_LVALUE_EXPR:
5995       /* If op0 is an expression ...  */
5996       if ((COMPARISON_CLASS_P (op0)
5997            || UNARY_CLASS_P (op0)
5998            || BINARY_CLASS_P (op0)
5999            || VL_EXP_CLASS_P (op0)
6000            || EXPRESSION_CLASS_P (op0))
6001           /* ... and has wrapping overflow, and its type is smaller
6002              than ctype, then we cannot pass through as widening.  */
6003           && (((ANY_INTEGRAL_TYPE_P (TREE_TYPE (op0))
6004                 && TYPE_OVERFLOW_WRAPS (TREE_TYPE (op0)))
6005                && (TYPE_PRECISION (ctype)
6006                    > TYPE_PRECISION (TREE_TYPE (op0))))
6007               /* ... or this is a truncation (t is narrower than op0),
6008                  then we cannot pass through this narrowing.  */
6009               || (TYPE_PRECISION (type)
6010                   < TYPE_PRECISION (TREE_TYPE (op0)))
6011               /* ... or signedness changes for division or modulus,
6012                  then we cannot pass through this conversion.  */
6013               || (code != MULT_EXPR
6014                   && (TYPE_UNSIGNED (ctype)
6015                       != TYPE_UNSIGNED (TREE_TYPE (op0))))
6016               /* ... or has undefined overflow while the converted to
6017                  type has not, we cannot do the operation in the inner type
6018                  as that would introduce undefined overflow.  */
6019               || ((ANY_INTEGRAL_TYPE_P (TREE_TYPE (op0))
6020                    && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0)))
6021                   && !TYPE_OVERFLOW_UNDEFINED (type))))
6022         break;
6023
6024       /* Pass the constant down and see if we can make a simplification.  If
6025          we can, replace this expression with the inner simplification for
6026          possible later conversion to our or some other type.  */
6027       if ((t2 = fold_convert (TREE_TYPE (op0), c)) != 0
6028           && TREE_CODE (t2) == INTEGER_CST
6029           && !TREE_OVERFLOW (t2)
6030           && (0 != (t1 = extract_muldiv (op0, t2, code,
6031                                          code == MULT_EXPR
6032                                          ? ctype : NULL_TREE,
6033                                          strict_overflow_p))))
6034         return t1;
6035       break;
6036
6037     case ABS_EXPR:
6038       /* If widening the type changes it from signed to unsigned, then we
6039          must avoid building ABS_EXPR itself as unsigned.  */
6040       if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
6041         {
6042           tree cstype = (*signed_type_for) (ctype);
6043           if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
6044               != 0)
6045             {
6046               t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
6047               return fold_convert (ctype, t1);
6048             }
6049           break;
6050         }
6051       /* If the constant is negative, we cannot simplify this.  */
6052       if (tree_int_cst_sgn (c) == -1)
6053         break;
6054       /* FALLTHROUGH */
6055     case NEGATE_EXPR:
6056       /* For division and modulus, type can't be unsigned, as e.g.
6057          (-(x / 2U)) / 2U isn't equal to -((x / 2U) / 2U) for x >= 2.
6058          For signed types, even with wrapping overflow, this is fine.  */
6059       if (code != MULT_EXPR && TYPE_UNSIGNED (type))
6060         break;
6061       if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
6062           != 0)
6063         return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
6064       break;
6065
6066     case MIN_EXPR:  case MAX_EXPR:
6067       /* If widening the type changes the signedness, then we can't perform
6068          this optimization as that changes the result.  */
6069       if (TYPE_UNSIGNED (ctype) != TYPE_UNSIGNED (type))
6070         break;
6071
6072       /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
6073       sub_strict_overflow_p = false;
6074       if ((t1 = extract_muldiv (op0, c, code, wide_type,
6075                                 &sub_strict_overflow_p)) != 0
6076           && (t2 = extract_muldiv (op1, c, code, wide_type,
6077                                    &sub_strict_overflow_p)) != 0)
6078         {
6079           if (tree_int_cst_sgn (c) < 0)
6080             tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
6081           if (sub_strict_overflow_p)
6082             *strict_overflow_p = true;
6083           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6084                               fold_convert (ctype, t2));
6085         }
6086       break;
6087
6088     case LSHIFT_EXPR:  case RSHIFT_EXPR:
6089       /* If the second operand is constant, this is a multiplication
6090          or floor division, by a power of two, so we can treat it that
6091          way unless the multiplier or divisor overflows.  Signed
6092          left-shift overflow is implementation-defined rather than
6093          undefined in C90, so do not convert signed left shift into
6094          multiplication.  */
6095       if (TREE_CODE (op1) == INTEGER_CST
6096           && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0)))
6097           /* const_binop may not detect overflow correctly,
6098              so check for it explicitly here.  */
6099           && wi::gtu_p (TYPE_PRECISION (TREE_TYPE (size_one_node)), op1)
6100           && 0 != (t1 = fold_convert (ctype,
6101                                       const_binop (LSHIFT_EXPR,
6102                                                    size_one_node,
6103                                                    op1)))
6104           && !TREE_OVERFLOW (t1))
6105         return extract_muldiv (build2 (tcode == LSHIFT_EXPR
6106                                        ? MULT_EXPR : FLOOR_DIV_EXPR,
6107                                        ctype,
6108                                        fold_convert (ctype, op0),
6109                                        t1),
6110                                c, code, wide_type, strict_overflow_p);
6111       break;
6112
6113     case PLUS_EXPR:  case MINUS_EXPR:
6114       /* See if we can eliminate the operation on both sides.  If we can, we
6115          can return a new PLUS or MINUS.  If we can't, the only remaining
6116          cases where we can do anything are if the second operand is a
6117          constant.  */
6118       sub_strict_overflow_p = false;
6119       t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
6120       t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
6121       if (t1 != 0 && t2 != 0
6122           && (code == MULT_EXPR
6123               /* If not multiplication, we can only do this if both operands
6124                  are divisible by c.  */
6125               || (multiple_of_p (ctype, op0, c)
6126                   && multiple_of_p (ctype, op1, c))))
6127         {
6128           if (sub_strict_overflow_p)
6129             *strict_overflow_p = true;
6130           return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6131                               fold_convert (ctype, t2));
6132         }
6133
6134       /* If this was a subtraction, negate OP1 and set it to be an addition.
6135          This simplifies the logic below.  */
6136       if (tcode == MINUS_EXPR)
6137         {
6138           tcode = PLUS_EXPR, op1 = negate_expr (op1);
6139           /* If OP1 was not easily negatable, the constant may be OP0.  */
6140           if (TREE_CODE (op0) == INTEGER_CST)
6141             {
6142               std::swap (op0, op1);
6143               std::swap (t1, t2);
6144             }
6145         }
6146
6147       if (TREE_CODE (op1) != INTEGER_CST)
6148         break;
6149
6150       /* If either OP1 or C are negative, this optimization is not safe for
6151          some of the division and remainder types while for others we need
6152          to change the code.  */
6153       if (tree_int_cst_sgn (op1) < 0 || tree_int_cst_sgn (c) < 0)
6154         {
6155           if (code == CEIL_DIV_EXPR)
6156             code = FLOOR_DIV_EXPR;
6157           else if (code == FLOOR_DIV_EXPR)
6158             code = CEIL_DIV_EXPR;
6159           else if (code != MULT_EXPR
6160                    && code != CEIL_MOD_EXPR && code != FLOOR_MOD_EXPR)
6161             break;
6162         }
6163
6164       /* If it's a multiply or a division/modulus operation of a multiple
6165          of our constant, do the operation and verify it doesn't overflow.  */
6166       if (code == MULT_EXPR
6167           || wi::multiple_of_p (op1, c, TYPE_SIGN (type)))
6168         {
6169           op1 = const_binop (code, fold_convert (ctype, op1),
6170                              fold_convert (ctype, c));
6171           /* We allow the constant to overflow with wrapping semantics.  */
6172           if (op1 == 0
6173               || (TREE_OVERFLOW (op1) && !TYPE_OVERFLOW_WRAPS (ctype)))
6174             break;
6175         }
6176       else
6177         break;
6178
6179       /* If we have an unsigned type, we cannot widen the operation since it
6180          will change the result if the original computation overflowed.  */
6181       if (TYPE_UNSIGNED (ctype) && ctype != type)
6182         break;
6183
6184       /* If we were able to eliminate our operation from the first side,
6185          apply our operation to the second side and reform the PLUS.  */
6186       if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
6187         return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
6188
6189       /* The last case is if we are a multiply.  In that case, we can
6190          apply the distributive law to commute the multiply and addition
6191          if the multiplication of the constants doesn't overflow
6192          and overflow is defined.  With undefined overflow
6193          op0 * c might overflow, while (op0 + orig_op1) * c doesn't.  */
6194       if (code == MULT_EXPR && TYPE_OVERFLOW_WRAPS (ctype))
6195         return fold_build2 (tcode, ctype,
6196                             fold_build2 (code, ctype,
6197                                          fold_convert (ctype, op0),
6198                                          fold_convert (ctype, c)),
6199                             op1);
6200
6201       break;
6202
6203     case MULT_EXPR:
6204       /* We have a special case here if we are doing something like
6205          (C * 8) % 4 since we know that's zero.  */
6206       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
6207            || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
6208           /* If the multiplication can overflow we cannot optimize this.  */
6209           && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t))
6210           && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
6211           && wi::multiple_of_p (op1, c, TYPE_SIGN (type)))
6212         {
6213           *strict_overflow_p = true;
6214           return omit_one_operand (type, integer_zero_node, op0);
6215         }
6216
6217       /* ... fall through ...  */
6218
6219     case TRUNC_DIV_EXPR:  case CEIL_DIV_EXPR:  case FLOOR_DIV_EXPR:
6220     case ROUND_DIV_EXPR:  case EXACT_DIV_EXPR:
6221       /* If we can extract our operation from the LHS, do so and return a
6222          new operation.  Likewise for the RHS from a MULT_EXPR.  Otherwise,
6223          do something only if the second operand is a constant.  */
6224       if (same_p
6225           && (t1 = extract_muldiv (op0, c, code, wide_type,
6226                                    strict_overflow_p)) != 0)
6227         return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
6228                             fold_convert (ctype, op1));
6229       else if (tcode == MULT_EXPR && code == MULT_EXPR
6230                && (t1 = extract_muldiv (op1, c, code, wide_type,
6231                                         strict_overflow_p)) != 0)
6232         return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
6233                             fold_convert (ctype, t1));
6234       else if (TREE_CODE (op1) != INTEGER_CST)
6235         return 0;
6236
6237       /* If these are the same operation types, we can associate them
6238          assuming no overflow.  */
6239       if (tcode == code)
6240         {
6241           bool overflow_p = false;
6242           bool overflow_mul_p;
6243           signop sign = TYPE_SIGN (ctype);
6244           wide_int mul = wi::mul (op1, c, sign, &overflow_mul_p);
6245           overflow_p = TREE_OVERFLOW (c) | TREE_OVERFLOW (op1);
6246           if (overflow_mul_p
6247               && ((sign == UNSIGNED && tcode != MULT_EXPR) || sign == SIGNED))
6248             overflow_p = true;
6249           if (!overflow_p)
6250             return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
6251                                 wide_int_to_tree (ctype, mul));
6252         }
6253
6254       /* If these operations "cancel" each other, we have the main
6255          optimizations of this pass, which occur when either constant is a
6256          multiple of the other, in which case we replace this with either an
6257          operation or CODE or TCODE.
6258
6259          If we have an unsigned type, we cannot do this since it will change
6260          the result if the original computation overflowed.  */
6261       if (TYPE_OVERFLOW_UNDEFINED (ctype)
6262           && ((code == MULT_EXPR && tcode == EXACT_DIV_EXPR)
6263               || (tcode == MULT_EXPR
6264                   && code != TRUNC_MOD_EXPR && code != CEIL_MOD_EXPR
6265                   && code != FLOOR_MOD_EXPR && code != ROUND_MOD_EXPR
6266                   && code != MULT_EXPR)))
6267         {
6268           if (wi::multiple_of_p (op1, c, TYPE_SIGN (type)))
6269             {
6270               if (TYPE_OVERFLOW_UNDEFINED (ctype))
6271                 *strict_overflow_p = true;
6272               return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
6273                                   fold_convert (ctype,
6274                                                 const_binop (TRUNC_DIV_EXPR,
6275                                                              op1, c)));
6276             }
6277           else if (wi::multiple_of_p (c, op1, TYPE_SIGN (type)))
6278             {
6279               if (TYPE_OVERFLOW_UNDEFINED (ctype))
6280                 *strict_overflow_p = true;
6281               return fold_build2 (code, ctype, fold_convert (ctype, op0),
6282                                   fold_convert (ctype,
6283                                                 const_binop (TRUNC_DIV_EXPR,
6284                                                              c, op1)));
6285             }
6286         }
6287       break;
6288
6289     default:
6290       break;
6291     }
6292
6293   return 0;
6294 }
6295 \f
6296 /* Return a node which has the indicated constant VALUE (either 0 or
6297    1 for scalars or {-1,-1,..} or {0,0,...} for vectors),
6298    and is of the indicated TYPE.  */
6299
6300 tree
6301 constant_boolean_node (bool value, tree type)
6302 {
6303   if (type == integer_type_node)
6304     return value ? integer_one_node : integer_zero_node;
6305   else if (type == boolean_type_node)
6306     return value ? boolean_true_node : boolean_false_node;
6307   else if (TREE_CODE (type) == VECTOR_TYPE)
6308     return build_vector_from_val (type,
6309                                   build_int_cst (TREE_TYPE (type),
6310                                                  value ? -1 : 0));
6311   else
6312     return fold_convert (type, value ? integer_one_node : integer_zero_node);
6313 }
6314
6315
6316 /* Transform `a + (b ? x : y)' into `b ? (a + x) : (a + y)'.
6317    Transform, `a + (x < y)' into `(x < y) ? (a + 1) : (a + 0)'.  Here
6318    CODE corresponds to the `+', COND to the `(b ? x : y)' or `(x < y)'
6319    expression, and ARG to `a'.  If COND_FIRST_P is nonzero, then the
6320    COND is the first argument to CODE; otherwise (as in the example
6321    given here), it is the second argument.  TYPE is the type of the
6322    original expression.  Return NULL_TREE if no simplification is
6323    possible.  */
6324
6325 static tree
6326 fold_binary_op_with_conditional_arg (location_t loc,
6327                                      enum tree_code code,
6328                                      tree type, tree op0, tree op1,
6329                                      tree cond, tree arg, int cond_first_p)
6330 {
6331   tree cond_type = cond_first_p ? TREE_TYPE (op0) : TREE_TYPE (op1);
6332   tree arg_type = cond_first_p ? TREE_TYPE (op1) : TREE_TYPE (op0);
6333   tree test, true_value, false_value;
6334   tree lhs = NULL_TREE;
6335   tree rhs = NULL_TREE;
6336   enum tree_code cond_code = COND_EXPR;
6337
6338   if (TREE_CODE (cond) == COND_EXPR
6339       || TREE_CODE (cond) == VEC_COND_EXPR)
6340     {
6341       test = TREE_OPERAND (cond, 0);
6342       true_value = TREE_OPERAND (cond, 1);
6343       false_value = TREE_OPERAND (cond, 2);
6344       /* If this operand throws an expression, then it does not make
6345          sense to try to perform a logical or arithmetic operation
6346          involving it.  */
6347       if (VOID_TYPE_P (TREE_TYPE (true_value)))
6348         lhs = true_value;
6349       if (VOID_TYPE_P (TREE_TYPE (false_value)))
6350         rhs = false_value;
6351     }
6352   else
6353     {
6354       tree testtype = TREE_TYPE (cond);
6355       test = cond;
6356       true_value = constant_boolean_node (true, testtype);
6357       false_value = constant_boolean_node (false, testtype);
6358     }
6359
6360   if (TREE_CODE (TREE_TYPE (test)) == VECTOR_TYPE)
6361     cond_code = VEC_COND_EXPR;
6362
6363   /* This transformation is only worthwhile if we don't have to wrap ARG
6364      in a SAVE_EXPR and the operation can be simplified without recursing
6365      on at least one of the branches once its pushed inside the COND_EXPR.  */
6366   if (!TREE_CONSTANT (arg)
6367       && (TREE_SIDE_EFFECTS (arg)
6368           || TREE_CODE (arg) == COND_EXPR || TREE_CODE (arg) == VEC_COND_EXPR
6369           || TREE_CONSTANT (true_value) || TREE_CONSTANT (false_value)))
6370     return NULL_TREE;
6371
6372   arg = fold_convert_loc (loc, arg_type, arg);
6373   if (lhs == 0)
6374     {
6375       true_value = fold_convert_loc (loc, cond_type, true_value);
6376       if (cond_first_p)
6377         lhs = fold_build2_loc (loc, code, type, true_value, arg);
6378       else
6379         lhs = fold_build2_loc (loc, code, type, arg, true_value);
6380     }
6381   if (rhs == 0)
6382     {
6383       false_value = fold_convert_loc (loc, cond_type, false_value);
6384       if (cond_first_p)
6385         rhs = fold_build2_loc (loc, code, type, false_value, arg);
6386       else
6387         rhs = fold_build2_loc (loc, code, type, arg, false_value);
6388     }
6389
6390   /* Check that we have simplified at least one of the branches.  */
6391   if (!TREE_CONSTANT (arg) && !TREE_CONSTANT (lhs) && !TREE_CONSTANT (rhs))
6392     return NULL_TREE;
6393
6394   return fold_build3_loc (loc, cond_code, type, test, lhs, rhs);
6395 }
6396
6397 \f
6398 /* Subroutine of fold() that checks for the addition of +/- 0.0.
6399
6400    If !NEGATE, return true if ADDEND is +/-0.0 and, for all X of type
6401    TYPE, X + ADDEND is the same as X.  If NEGATE, return true if X -
6402    ADDEND is the same as X.
6403
6404    X + 0 and X - 0 both give X when X is NaN, infinite, or nonzero
6405    and finite.  The problematic cases are when X is zero, and its mode
6406    has signed zeros.  In the case of rounding towards -infinity,
6407    X - 0 is not the same as X because 0 - 0 is -0.  In other rounding
6408    modes, X + 0 is not the same as X because -0 + 0 is 0.  */
6409
6410 bool
6411 fold_real_zero_addition_p (const_tree type, const_tree addend, int negate)
6412 {
6413   if (!real_zerop (addend))
6414     return false;
6415
6416   /* Don't allow the fold with -fsignaling-nans.  */
6417   if (HONOR_SNANS (element_mode (type)))
6418     return false;
6419
6420   /* Allow the fold if zeros aren't signed, or their sign isn't important.  */
6421   if (!HONOR_SIGNED_ZEROS (element_mode (type)))
6422     return true;
6423
6424   /* In a vector or complex, we would need to check the sign of all zeros.  */
6425   if (TREE_CODE (addend) != REAL_CST)
6426     return false;
6427
6428   /* Treat x + -0 as x - 0 and x - -0 as x + 0.  */
6429   if (REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (addend)))
6430     negate = !negate;
6431
6432   /* The mode has signed zeros, and we have to honor their sign.
6433      In this situation, there is only one case we can return true for.
6434      X - 0 is the same as X unless rounding towards -infinity is
6435      supported.  */
6436   return negate && !HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type));
6437 }
6438
6439 /* Subroutine of fold() that checks comparisons of built-in math
6440    functions against real constants.
6441
6442    FCODE is the DECL_FUNCTION_CODE of the built-in, CODE is the comparison
6443    operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR, GE_EXPR or LE_EXPR.  TYPE
6444    is the type of the result and ARG0 and ARG1 are the operands of the
6445    comparison.  ARG1 must be a TREE_REAL_CST.
6446
6447    The function returns the constant folded tree if a simplification
6448    can be made, and NULL_TREE otherwise.  */
6449
6450 static tree
6451 fold_mathfn_compare (location_t loc,
6452                      enum built_in_function fcode, enum tree_code code,
6453                      tree type, tree arg0, tree arg1)
6454 {
6455   REAL_VALUE_TYPE c;
6456
6457   if (BUILTIN_SQRT_P (fcode))
6458     {
6459       tree arg = CALL_EXPR_ARG (arg0, 0);
6460       machine_mode mode = TYPE_MODE (TREE_TYPE (arg0));
6461
6462       c = TREE_REAL_CST (arg1);
6463       if (REAL_VALUE_NEGATIVE (c))
6464         {
6465           /* sqrt(x) < y is always false, if y is negative.  */
6466           if (code == EQ_EXPR || code == LT_EXPR || code == LE_EXPR)
6467             return omit_one_operand_loc (loc, type, integer_zero_node, arg);
6468
6469           /* sqrt(x) > y is always true, if y is negative and we
6470              don't care about NaNs, i.e. negative values of x.  */
6471           if (code == NE_EXPR || !HONOR_NANS (mode))
6472             return omit_one_operand_loc (loc, type, integer_one_node, arg);
6473
6474           /* sqrt(x) > y is the same as x >= 0, if y is negative.  */
6475           return fold_build2_loc (loc, GE_EXPR, type, arg,
6476                               build_real (TREE_TYPE (arg), dconst0));
6477         }
6478       else if (code == GT_EXPR || code == GE_EXPR)
6479         {
6480           REAL_VALUE_TYPE c2;
6481
6482           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6483           real_convert (&c2, mode, &c2);
6484
6485           if (REAL_VALUE_ISINF (c2))
6486             {
6487               /* sqrt(x) > y is x == +Inf, when y is very large.  */
6488               if (HONOR_INFINITIES (mode))
6489                 return fold_build2_loc (loc, EQ_EXPR, type, arg,
6490                                     build_real (TREE_TYPE (arg), c2));
6491
6492               /* sqrt(x) > y is always false, when y is very large
6493                  and we don't care about infinities.  */
6494               return omit_one_operand_loc (loc, type, integer_zero_node, arg);
6495             }
6496
6497           /* sqrt(x) > c is the same as x > c*c.  */
6498           return fold_build2_loc (loc, code, type, arg,
6499                               build_real (TREE_TYPE (arg), c2));
6500         }
6501       else if (code == LT_EXPR || code == LE_EXPR)
6502         {
6503           REAL_VALUE_TYPE c2;
6504
6505           REAL_ARITHMETIC (c2, MULT_EXPR, c, c);
6506           real_convert (&c2, mode, &c2);
6507
6508           if (REAL_VALUE_ISINF (c2))
6509             {
6510               /* sqrt(x) < y is always true, when y is a very large
6511                  value and we don't care about NaNs or Infinities.  */
6512               if (! HONOR_NANS (mode) && ! HONOR_INFINITIES (mode))
6513                 return omit_one_operand_loc (loc, type, integer_one_node, arg);
6514
6515               /* sqrt(x) < y is x != +Inf when y is very large and we
6516                  don't care about NaNs.  */
6517               if (! HONOR_NANS (mode))
6518                 return fold_build2_loc (loc, NE_EXPR, type, arg,
6519                                     build_real (TREE_TYPE (arg), c2));
6520
6521               /* sqrt(x) < y is x >= 0 when y is very large and we
6522                  don't care about Infinities.  */
6523               if (! HONOR_INFINITIES (mode))
6524                 return fold_build2_loc (loc, GE_EXPR, type, arg,
6525                                     build_real (TREE_TYPE (arg), dconst0));
6526
6527               /* sqrt(x) < y is x >= 0 && x != +Inf, when y is large.  */
6528               arg = save_expr (arg);
6529               return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
6530                                   fold_build2_loc (loc, GE_EXPR, type, arg,
6531                                                build_real (TREE_TYPE (arg),
6532                                                            dconst0)),
6533                                   fold_build2_loc (loc, NE_EXPR, type, arg,
6534                                                build_real (TREE_TYPE (arg),
6535                                                            c2)));
6536             }
6537
6538           /* sqrt(x) < c is the same as x < c*c, if we ignore NaNs.  */
6539           if (! HONOR_NANS (mode))
6540             return fold_build2_loc (loc, code, type, arg,
6541                                 build_real (TREE_TYPE (arg), c2));
6542
6543           /* sqrt(x) < c is the same as x >= 0 && x < c*c.  */
6544           arg = save_expr (arg);
6545           return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
6546                                   fold_build2_loc (loc, GE_EXPR, type, arg,
6547                                                build_real (TREE_TYPE (arg),
6548                                                            dconst0)),
6549                                   fold_build2_loc (loc, code, type, arg,
6550                                                build_real (TREE_TYPE (arg),
6551                                                            c2)));
6552         }
6553     }
6554
6555   return NULL_TREE;
6556 }
6557
6558 /* Subroutine of fold() that optimizes comparisons against Infinities,
6559    either +Inf or -Inf.
6560
6561    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6562    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6563    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6564
6565    The function returns the constant folded tree if a simplification
6566    can be made, and NULL_TREE otherwise.  */
6567
6568 static tree
6569 fold_inf_compare (location_t loc, enum tree_code code, tree type,
6570                   tree arg0, tree arg1)
6571 {
6572   machine_mode mode;
6573   REAL_VALUE_TYPE max;
6574   tree temp;
6575   bool neg;
6576
6577   mode = TYPE_MODE (TREE_TYPE (arg0));
6578
6579   /* For negative infinity swap the sense of the comparison.  */
6580   neg = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1));
6581   if (neg)
6582     code = swap_tree_comparison (code);
6583
6584   switch (code)
6585     {
6586     case GT_EXPR:
6587       /* x > +Inf is always false, if with ignore sNANs.  */
6588       if (HONOR_SNANS (mode))
6589         return NULL_TREE;
6590       return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
6591
6592     case LE_EXPR:
6593       /* x <= +Inf is always true, if we don't case about NaNs.  */
6594       if (! HONOR_NANS (mode))
6595         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
6596
6597       /* x <= +Inf is the same as x == x, i.e. isfinite(x).  */
6598       arg0 = save_expr (arg0);
6599       return fold_build2_loc (loc, EQ_EXPR, type, arg0, arg0);
6600
6601     case EQ_EXPR:
6602     case GE_EXPR:
6603       /* x == +Inf and x >= +Inf are always equal to x > DBL_MAX.  */
6604       real_maxval (&max, neg, mode);
6605       return fold_build2_loc (loc, neg ? LT_EXPR : GT_EXPR, type,
6606                           arg0, build_real (TREE_TYPE (arg0), max));
6607
6608     case LT_EXPR:
6609       /* x < +Inf is always equal to x <= DBL_MAX.  */
6610       real_maxval (&max, neg, mode);
6611       return fold_build2_loc (loc, neg ? GE_EXPR : LE_EXPR, type,
6612                           arg0, build_real (TREE_TYPE (arg0), max));
6613
6614     case NE_EXPR:
6615       /* x != +Inf is always equal to !(x > DBL_MAX).  */
6616       real_maxval (&max, neg, mode);
6617       if (! HONOR_NANS (mode))
6618         return fold_build2_loc (loc, neg ? GE_EXPR : LE_EXPR, type,
6619                             arg0, build_real (TREE_TYPE (arg0), max));
6620
6621       temp = fold_build2_loc (loc, neg ? LT_EXPR : GT_EXPR, type,
6622                           arg0, build_real (TREE_TYPE (arg0), max));
6623       return fold_build1_loc (loc, TRUTH_NOT_EXPR, type, temp);
6624
6625     default:
6626       break;
6627     }
6628
6629   return NULL_TREE;
6630 }
6631
6632 /* Subroutine of fold() that optimizes comparisons of a division by
6633    a nonzero integer constant against an integer constant, i.e.
6634    X/C1 op C2.
6635
6636    CODE is the comparison operator: EQ_EXPR, NE_EXPR, GT_EXPR, LT_EXPR,
6637    GE_EXPR or LE_EXPR.  TYPE is the type of the result and ARG0 and ARG1
6638    are the operands of the comparison.  ARG1 must be a TREE_REAL_CST.
6639
6640    The function returns the constant folded tree if a simplification
6641    can be made, and NULL_TREE otherwise.  */
6642
6643 static tree
6644 fold_div_compare (location_t loc,
6645                   enum tree_code code, tree type, tree arg0, tree arg1)
6646 {
6647   tree prod, tmp, hi, lo;
6648   tree arg00 = TREE_OPERAND (arg0, 0);
6649   tree arg01 = TREE_OPERAND (arg0, 1);
6650   signop sign = TYPE_SIGN (TREE_TYPE (arg0));
6651   bool neg_overflow = false;
6652   bool overflow;
6653
6654   /* We have to do this the hard way to detect unsigned overflow.
6655      prod = int_const_binop (MULT_EXPR, arg01, arg1);  */
6656   wide_int val = wi::mul (arg01, arg1, sign, &overflow);
6657   prod = force_fit_type (TREE_TYPE (arg00), val, -1, overflow);
6658   neg_overflow = false;
6659
6660   if (sign == UNSIGNED)
6661     {
6662       tmp = int_const_binop (MINUS_EXPR, arg01,
6663                              build_int_cst (TREE_TYPE (arg01), 1));
6664       lo = prod;
6665
6666       /* Likewise hi = int_const_binop (PLUS_EXPR, prod, tmp).  */
6667       val = wi::add (prod, tmp, sign, &overflow);
6668       hi = force_fit_type (TREE_TYPE (arg00), val,
6669                            -1, overflow | TREE_OVERFLOW (prod));
6670     }
6671   else if (tree_int_cst_sgn (arg01) >= 0)
6672     {
6673       tmp = int_const_binop (MINUS_EXPR, arg01,
6674                              build_int_cst (TREE_TYPE (arg01), 1));
6675       switch (tree_int_cst_sgn (arg1))
6676         {
6677         case -1:
6678           neg_overflow = true;
6679           lo = int_const_binop (MINUS_EXPR, prod, tmp);
6680           hi = prod;
6681           break;
6682
6683         case  0:
6684           lo = fold_negate_const (tmp, TREE_TYPE (arg0));
6685           hi = tmp;
6686           break;
6687
6688         case  1:
6689           hi = int_const_binop (PLUS_EXPR, prod, tmp);
6690           lo = prod;
6691           break;
6692
6693         default:
6694           gcc_unreachable ();
6695         }
6696     }
6697   else
6698     {
6699       /* A negative divisor reverses the relational operators.  */
6700       code = swap_tree_comparison (code);
6701
6702       tmp = int_const_binop (PLUS_EXPR, arg01,
6703                              build_int_cst (TREE_TYPE (arg01), 1));
6704       switch (tree_int_cst_sgn (arg1))
6705         {
6706         case -1:
6707           hi = int_const_binop (MINUS_EXPR, prod, tmp);
6708           lo = prod;
6709           break;
6710
6711         case  0:
6712           hi = fold_negate_const (tmp, TREE_TYPE (arg0));
6713           lo = tmp;
6714           break;
6715
6716         case  1:
6717           neg_overflow = true;
6718           lo = int_const_binop (PLUS_EXPR, prod, tmp);
6719           hi = prod;
6720           break;
6721
6722         default:
6723           gcc_unreachable ();
6724         }
6725     }
6726
6727   switch (code)
6728     {
6729     case EQ_EXPR:
6730       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6731         return omit_one_operand_loc (loc, type, integer_zero_node, arg00);
6732       if (TREE_OVERFLOW (hi))
6733         return fold_build2_loc (loc, GE_EXPR, type, arg00, lo);
6734       if (TREE_OVERFLOW (lo))
6735         return fold_build2_loc (loc, LE_EXPR, type, arg00, hi);
6736       return build_range_check (loc, type, arg00, 1, lo, hi);
6737
6738     case NE_EXPR:
6739       if (TREE_OVERFLOW (lo) && TREE_OVERFLOW (hi))
6740         return omit_one_operand_loc (loc, type, integer_one_node, arg00);
6741       if (TREE_OVERFLOW (hi))
6742         return fold_build2_loc (loc, LT_EXPR, type, arg00, lo);
6743       if (TREE_OVERFLOW (lo))
6744         return fold_build2_loc (loc, GT_EXPR, type, arg00, hi);
6745       return build_range_check (loc, type, arg00, 0, lo, hi);
6746
6747     case LT_EXPR:
6748       if (TREE_OVERFLOW (lo))
6749         {
6750           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6751           return omit_one_operand_loc (loc, type, tmp, arg00);
6752         }
6753       return fold_build2_loc (loc, LT_EXPR, type, arg00, lo);
6754
6755     case LE_EXPR:
6756       if (TREE_OVERFLOW (hi))
6757         {
6758           tmp = neg_overflow ? integer_zero_node : integer_one_node;
6759           return omit_one_operand_loc (loc, type, tmp, arg00);
6760         }
6761       return fold_build2_loc (loc, LE_EXPR, type, arg00, hi);
6762
6763     case GT_EXPR:
6764       if (TREE_OVERFLOW (hi))
6765         {
6766           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6767           return omit_one_operand_loc (loc, type, tmp, arg00);
6768         }
6769       return fold_build2_loc (loc, GT_EXPR, type, arg00, hi);
6770
6771     case GE_EXPR:
6772       if (TREE_OVERFLOW (lo))
6773         {
6774           tmp = neg_overflow ? integer_one_node : integer_zero_node;
6775           return omit_one_operand_loc (loc, type, tmp, arg00);
6776         }
6777       return fold_build2_loc (loc, GE_EXPR, type, arg00, lo);
6778
6779     default:
6780       break;
6781     }
6782
6783   return NULL_TREE;
6784 }
6785
6786
6787 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6788    equality/inequality test, then return a simplified form of the test
6789    using a sign testing.  Otherwise return NULL.  TYPE is the desired
6790    result type.  */
6791
6792 static tree
6793 fold_single_bit_test_into_sign_test (location_t loc,
6794                                      enum tree_code code, tree arg0, tree arg1,
6795                                      tree result_type)
6796 {
6797   /* If this is testing a single bit, we can optimize the test.  */
6798   if ((code == NE_EXPR || code == EQ_EXPR)
6799       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6800       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6801     {
6802       /* If we have (A & C) != 0 where C is the sign bit of A, convert
6803          this into A < 0.  Similarly for (A & C) == 0 into A >= 0.  */
6804       tree arg00 = sign_bit_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg0, 1));
6805
6806       if (arg00 != NULL_TREE
6807           /* This is only a win if casting to a signed type is cheap,
6808              i.e. when arg00's type is not a partial mode.  */
6809           && TYPE_PRECISION (TREE_TYPE (arg00))
6810              == GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (arg00))))
6811         {
6812           tree stype = signed_type_for (TREE_TYPE (arg00));
6813           return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR,
6814                               result_type,
6815                               fold_convert_loc (loc, stype, arg00),
6816                               build_int_cst (stype, 0));
6817         }
6818     }
6819
6820   return NULL_TREE;
6821 }
6822
6823 /* If CODE with arguments ARG0 and ARG1 represents a single bit
6824    equality/inequality test, then return a simplified form of
6825    the test using shifts and logical operations.  Otherwise return
6826    NULL.  TYPE is the desired result type.  */
6827
6828 tree
6829 fold_single_bit_test (location_t loc, enum tree_code code,
6830                       tree arg0, tree arg1, tree result_type)
6831 {
6832   /* If this is testing a single bit, we can optimize the test.  */
6833   if ((code == NE_EXPR || code == EQ_EXPR)
6834       && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1)
6835       && integer_pow2p (TREE_OPERAND (arg0, 1)))
6836     {
6837       tree inner = TREE_OPERAND (arg0, 0);
6838       tree type = TREE_TYPE (arg0);
6839       int bitnum = tree_log2 (TREE_OPERAND (arg0, 1));
6840       machine_mode operand_mode = TYPE_MODE (type);
6841       int ops_unsigned;
6842       tree signed_type, unsigned_type, intermediate_type;
6843       tree tem, one;
6844
6845       /* First, see if we can fold the single bit test into a sign-bit
6846          test.  */
6847       tem = fold_single_bit_test_into_sign_test (loc, code, arg0, arg1,
6848                                                  result_type);
6849       if (tem)
6850         return tem;
6851
6852       /* Otherwise we have (A & C) != 0 where C is a single bit,
6853          convert that into ((A >> C2) & 1).  Where C2 = log2(C).
6854          Similarly for (A & C) == 0.  */
6855
6856       /* If INNER is a right shift of a constant and it plus BITNUM does
6857          not overflow, adjust BITNUM and INNER.  */
6858       if (TREE_CODE (inner) == RSHIFT_EXPR
6859           && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST
6860           && bitnum < TYPE_PRECISION (type)
6861           && wi::ltu_p (TREE_OPERAND (inner, 1),
6862                         TYPE_PRECISION (type) - bitnum))
6863         {
6864           bitnum += tree_to_uhwi (TREE_OPERAND (inner, 1));
6865           inner = TREE_OPERAND (inner, 0);
6866         }
6867
6868       /* If we are going to be able to omit the AND below, we must do our
6869          operations as unsigned.  If we must use the AND, we have a choice.
6870          Normally unsigned is faster, but for some machines signed is.  */
6871 #ifdef LOAD_EXTEND_OP
6872       ops_unsigned = (LOAD_EXTEND_OP (operand_mode) == SIGN_EXTEND
6873                       && !flag_syntax_only) ? 0 : 1;
6874 #else
6875       ops_unsigned = 1;
6876 #endif
6877
6878       signed_type = lang_hooks.types.type_for_mode (operand_mode, 0);
6879       unsigned_type = lang_hooks.types.type_for_mode (operand_mode, 1);
6880       intermediate_type = ops_unsigned ? unsigned_type : signed_type;
6881       inner = fold_convert_loc (loc, intermediate_type, inner);
6882
6883       if (bitnum != 0)
6884         inner = build2 (RSHIFT_EXPR, intermediate_type,
6885                         inner, size_int (bitnum));
6886
6887       one = build_int_cst (intermediate_type, 1);
6888
6889       if (code == EQ_EXPR)
6890         inner = fold_build2_loc (loc, BIT_XOR_EXPR, intermediate_type, inner, one);
6891
6892       /* Put the AND last so it can combine with more things.  */
6893       inner = build2 (BIT_AND_EXPR, intermediate_type, inner, one);
6894
6895       /* Make sure to return the proper type.  */
6896       inner = fold_convert_loc (loc, result_type, inner);
6897
6898       return inner;
6899     }
6900   return NULL_TREE;
6901 }
6902
6903 /* Check whether we are allowed to reorder operands arg0 and arg1,
6904    such that the evaluation of arg1 occurs before arg0.  */
6905
6906 static bool
6907 reorder_operands_p (const_tree arg0, const_tree arg1)
6908 {
6909   if (! flag_evaluation_order)
6910       return true;
6911   if (TREE_CONSTANT (arg0) || TREE_CONSTANT (arg1))
6912     return true;
6913   return ! TREE_SIDE_EFFECTS (arg0)
6914          && ! TREE_SIDE_EFFECTS (arg1);
6915 }
6916
6917 /* Test whether it is preferable two swap two operands, ARG0 and
6918    ARG1, for example because ARG0 is an integer constant and ARG1
6919    isn't.  If REORDER is true, only recommend swapping if we can
6920    evaluate the operands in reverse order.  */
6921
6922 bool
6923 tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder)
6924 {
6925   if (CONSTANT_CLASS_P (arg1))
6926     return 0;
6927   if (CONSTANT_CLASS_P (arg0))
6928     return 1;
6929
6930   STRIP_NOPS (arg0);
6931   STRIP_NOPS (arg1);
6932
6933   if (TREE_CONSTANT (arg1))
6934     return 0;
6935   if (TREE_CONSTANT (arg0))
6936     return 1;
6937
6938   if (reorder && flag_evaluation_order
6939       && (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)))
6940     return 0;
6941
6942   /* It is preferable to swap two SSA_NAME to ensure a canonical form
6943      for commutative and comparison operators.  Ensuring a canonical
6944      form allows the optimizers to find additional redundancies without
6945      having to explicitly check for both orderings.  */
6946   if (TREE_CODE (arg0) == SSA_NAME
6947       && TREE_CODE (arg1) == SSA_NAME
6948       && SSA_NAME_VERSION (arg0) > SSA_NAME_VERSION (arg1))
6949     return 1;
6950
6951   /* Put SSA_NAMEs last.  */
6952   if (TREE_CODE (arg1) == SSA_NAME)
6953     return 0;
6954   if (TREE_CODE (arg0) == SSA_NAME)
6955     return 1;
6956
6957   /* Put variables last.  */
6958   if (DECL_P (arg1))
6959     return 0;
6960   if (DECL_P (arg0))
6961     return 1;
6962
6963   return 0;
6964 }
6965
6966 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where
6967    ARG0 is extended to a wider type.  */
6968
6969 static tree
6970 fold_widened_comparison (location_t loc, enum tree_code code,
6971                          tree type, tree arg0, tree arg1)
6972 {
6973   tree arg0_unw = get_unwidened (arg0, NULL_TREE);
6974   tree arg1_unw;
6975   tree shorter_type, outer_type;
6976   tree min, max;
6977   bool above, below;
6978
6979   if (arg0_unw == arg0)
6980     return NULL_TREE;
6981   shorter_type = TREE_TYPE (arg0_unw);
6982
6983 #ifdef HAVE_canonicalize_funcptr_for_compare
6984   /* Disable this optimization if we're casting a function pointer
6985      type on targets that require function pointer canonicalization.  */
6986   if (HAVE_canonicalize_funcptr_for_compare
6987       && TREE_CODE (shorter_type) == POINTER_TYPE
6988       && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE)
6989     return NULL_TREE;
6990 #endif
6991
6992   if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
6993     return NULL_TREE;
6994
6995   arg1_unw = get_unwidened (arg1, NULL_TREE);
6996
6997   /* If possible, express the comparison in the shorter mode.  */
6998   if ((code == EQ_EXPR || code == NE_EXPR
6999        || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
7000       && (TREE_TYPE (arg1_unw) == shorter_type
7001           || ((TYPE_PRECISION (shorter_type)
7002                >= TYPE_PRECISION (TREE_TYPE (arg1_unw)))
7003               && (TYPE_UNSIGNED (shorter_type)
7004                   == TYPE_UNSIGNED (TREE_TYPE (arg1_unw))))
7005           || (TREE_CODE (arg1_unw) == INTEGER_CST
7006               && (TREE_CODE (shorter_type) == INTEGER_TYPE
7007                   || TREE_CODE (shorter_type) == BOOLEAN_TYPE)
7008               && int_fits_type_p (arg1_unw, shorter_type))))
7009     return fold_build2_loc (loc, code, type, arg0_unw,
7010                         fold_convert_loc (loc, shorter_type, arg1_unw));
7011
7012   if (TREE_CODE (arg1_unw) != INTEGER_CST
7013       || TREE_CODE (shorter_type) != INTEGER_TYPE
7014       || !int_fits_type_p (arg1_unw, shorter_type))
7015     return NULL_TREE;
7016
7017   /* If we are comparing with the integer that does not fit into the range
7018      of the shorter type, the result is known.  */
7019   outer_type = TREE_TYPE (arg1_unw);
7020   min = lower_bound_in_type (outer_type, shorter_type);
7021   max = upper_bound_in_type (outer_type, shorter_type);
7022
7023   above = integer_nonzerop (fold_relational_const (LT_EXPR, type,
7024                                                    max, arg1_unw));
7025   below = integer_nonzerop (fold_relational_const (LT_EXPR, type,
7026                                                    arg1_unw, min));
7027
7028   switch (code)
7029     {
7030     case EQ_EXPR:
7031       if (above || below)
7032         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
7033       break;
7034
7035     case NE_EXPR:
7036       if (above || below)
7037         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
7038       break;
7039
7040     case LT_EXPR:
7041     case LE_EXPR:
7042       if (above)
7043         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
7044       else if (below)
7045         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
7046
7047     case GT_EXPR:
7048     case GE_EXPR:
7049       if (above)
7050         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
7051       else if (below)
7052         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
7053
7054     default:
7055       break;
7056     }
7057
7058   return NULL_TREE;
7059 }
7060
7061 /* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for
7062    ARG0 just the signedness is changed.  */
7063
7064 static tree
7065 fold_sign_changed_comparison (location_t loc, enum tree_code code, tree type,
7066                               tree arg0, tree arg1)
7067 {
7068   tree arg0_inner;
7069   tree inner_type, outer_type;
7070
7071   if (!CONVERT_EXPR_P (arg0))
7072     return NULL_TREE;
7073
7074   outer_type = TREE_TYPE (arg0);
7075   arg0_inner = TREE_OPERAND (arg0, 0);
7076   inner_type = TREE_TYPE (arg0_inner);
7077
7078 #ifdef HAVE_canonicalize_funcptr_for_compare
7079   /* Disable this optimization if we're casting a function pointer
7080      type on targets that require function pointer canonicalization.  */
7081   if (HAVE_canonicalize_funcptr_for_compare
7082       && TREE_CODE (inner_type) == POINTER_TYPE
7083       && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE)
7084     return NULL_TREE;
7085 #endif
7086
7087   if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
7088     return NULL_TREE;
7089
7090   if (TREE_CODE (arg1) != INTEGER_CST
7091       && !(CONVERT_EXPR_P (arg1)
7092            && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type))
7093     return NULL_TREE;
7094
7095   if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type)
7096       && code != NE_EXPR
7097       && code != EQ_EXPR)
7098     return NULL_TREE;
7099
7100   if (POINTER_TYPE_P (inner_type) != POINTER_TYPE_P (outer_type))
7101     return NULL_TREE;
7102
7103   if (TREE_CODE (arg1) == INTEGER_CST)
7104     arg1 = force_fit_type (inner_type, wi::to_widest (arg1), 0,
7105                            TREE_OVERFLOW (arg1));
7106   else
7107     arg1 = fold_convert_loc (loc, inner_type, arg1);
7108
7109   return fold_build2_loc (loc, code, type, arg0_inner, arg1);
7110 }
7111
7112
7113 /* Fold A < X && A + 1 > Y to A < X && A >= Y.  Normally A + 1 > Y
7114    means A >= Y && A != MAX, but in this case we know that
7115    A < X <= MAX.  INEQ is A + 1 > Y, BOUND is A < X.  */
7116
7117 static tree
7118 fold_to_nonsharp_ineq_using_bound (location_t loc, tree ineq, tree bound)
7119 {
7120   tree a, typea, type = TREE_TYPE (ineq), a1, diff, y;
7121
7122   if (TREE_CODE (bound) == LT_EXPR)
7123     a = TREE_OPERAND (bound, 0);
7124   else if (TREE_CODE (bound) == GT_EXPR)
7125     a = TREE_OPERAND (bound, 1);
7126   else
7127     return NULL_TREE;
7128
7129   typea = TREE_TYPE (a);
7130   if (!INTEGRAL_TYPE_P (typea)
7131       && !POINTER_TYPE_P (typea))
7132     return NULL_TREE;
7133
7134   if (TREE_CODE (ineq) == LT_EXPR)
7135     {
7136       a1 = TREE_OPERAND (ineq, 1);
7137       y = TREE_OPERAND (ineq, 0);
7138     }
7139   else if (TREE_CODE (ineq) == GT_EXPR)
7140     {
7141       a1 = TREE_OPERAND (ineq, 0);
7142       y = TREE_OPERAND (ineq, 1);
7143     }
7144   else
7145     return NULL_TREE;
7146
7147   if (TREE_TYPE (a1) != typea)
7148     return NULL_TREE;
7149
7150   if (POINTER_TYPE_P (typea))
7151     {
7152       /* Convert the pointer types into integer before taking the difference.  */
7153       tree ta = fold_convert_loc (loc, ssizetype, a);
7154       tree ta1 = fold_convert_loc (loc, ssizetype, a1);
7155       diff = fold_binary_loc (loc, MINUS_EXPR, ssizetype, ta1, ta);
7156     }
7157   else
7158     diff = fold_binary_loc (loc, MINUS_EXPR, typea, a1, a);
7159
7160   if (!diff || !integer_onep (diff))
7161    return NULL_TREE;
7162
7163   return fold_build2_loc (loc, GE_EXPR, type, a, y);
7164 }
7165
7166 /* Fold a sum or difference of at least one multiplication.
7167    Returns the folded tree or NULL if no simplification could be made.  */
7168
7169 static tree
7170 fold_plusminus_mult_expr (location_t loc, enum tree_code code, tree type,
7171                           tree arg0, tree arg1)
7172 {
7173   tree arg00, arg01, arg10, arg11;
7174   tree alt0 = NULL_TREE, alt1 = NULL_TREE, same;
7175
7176   /* (A * C) +- (B * C) -> (A+-B) * C.
7177      (A * C) +- A -> A * (C+-1).
7178      We are most concerned about the case where C is a constant,
7179      but other combinations show up during loop reduction.  Since
7180      it is not difficult, try all four possibilities.  */
7181
7182   if (TREE_CODE (arg0) == MULT_EXPR)
7183     {
7184       arg00 = TREE_OPERAND (arg0, 0);
7185       arg01 = TREE_OPERAND (arg0, 1);
7186     }
7187   else if (TREE_CODE (arg0) == INTEGER_CST)
7188     {
7189       arg00 = build_one_cst (type);
7190       arg01 = arg0;
7191     }
7192   else
7193     {
7194       /* We cannot generate constant 1 for fract.  */
7195       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7196         return NULL_TREE;
7197       arg00 = arg0;
7198       arg01 = build_one_cst (type);
7199     }
7200   if (TREE_CODE (arg1) == MULT_EXPR)
7201     {
7202       arg10 = TREE_OPERAND (arg1, 0);
7203       arg11 = TREE_OPERAND (arg1, 1);
7204     }
7205   else if (TREE_CODE (arg1) == INTEGER_CST)
7206     {
7207       arg10 = build_one_cst (type);
7208       /* As we canonicalize A - 2 to A + -2 get rid of that sign for
7209          the purpose of this canonicalization.  */
7210       if (wi::neg_p (arg1, TYPE_SIGN (TREE_TYPE (arg1)))
7211           && negate_expr_p (arg1)
7212           && code == PLUS_EXPR)
7213         {
7214           arg11 = negate_expr (arg1);
7215           code = MINUS_EXPR;
7216         }
7217       else
7218         arg11 = arg1;
7219     }
7220   else
7221     {
7222       /* We cannot generate constant 1 for fract.  */
7223       if (ALL_FRACT_MODE_P (TYPE_MODE (type)))
7224         return NULL_TREE;
7225       arg10 = arg1;
7226       arg11 = build_one_cst (type);
7227     }
7228   same = NULL_TREE;
7229
7230   if (operand_equal_p (arg01, arg11, 0))
7231     same = arg01, alt0 = arg00, alt1 = arg10;
7232   else if (operand_equal_p (arg00, arg10, 0))
7233     same = arg00, alt0 = arg01, alt1 = arg11;
7234   else if (operand_equal_p (arg00, arg11, 0))
7235     same = arg00, alt0 = arg01, alt1 = arg10;
7236   else if (operand_equal_p (arg01, arg10, 0))
7237     same = arg01, alt0 = arg00, alt1 = arg11;
7238
7239   /* No identical multiplicands; see if we can find a common
7240      power-of-two factor in non-power-of-two multiplies.  This
7241      can help in multi-dimensional array access.  */
7242   else if (tree_fits_shwi_p (arg01)
7243            && tree_fits_shwi_p (arg11))
7244     {
7245       HOST_WIDE_INT int01, int11, tmp;
7246       bool swap = false;
7247       tree maybe_same;
7248       int01 = tree_to_shwi (arg01);
7249       int11 = tree_to_shwi (arg11);
7250
7251       /* Move min of absolute values to int11.  */
7252       if (absu_hwi (int01) < absu_hwi (int11))
7253         {
7254           tmp = int01, int01 = int11, int11 = tmp;
7255           alt0 = arg00, arg00 = arg10, arg10 = alt0;
7256           maybe_same = arg01;
7257           swap = true;
7258         }
7259       else
7260         maybe_same = arg11;
7261
7262       if (exact_log2 (absu_hwi (int11)) > 0 && int01 % int11 == 0
7263           /* The remainder should not be a constant, otherwise we
7264              end up folding i * 4 + 2 to (i * 2 + 1) * 2 which has
7265              increased the number of multiplications necessary.  */
7266           && TREE_CODE (arg10) != INTEGER_CST)
7267         {
7268           alt0 = fold_build2_loc (loc, MULT_EXPR, TREE_TYPE (arg00), arg00,
7269                               build_int_cst (TREE_TYPE (arg00),
7270                                              int01 / int11));
7271           alt1 = arg10;
7272           same = maybe_same;
7273           if (swap)
7274             maybe_same = alt0, alt0 = alt1, alt1 = maybe_same;
7275         }
7276     }
7277
7278   if (same)
7279     return fold_build2_loc (loc, MULT_EXPR, type,
7280                         fold_build2_loc (loc, code, type,
7281                                      fold_convert_loc (loc, type, alt0),
7282                                      fold_convert_loc (loc, type, alt1)),
7283                         fold_convert_loc (loc, type, same));
7284
7285   return NULL_TREE;
7286 }
7287
7288 /* Subroutine of native_encode_expr.  Encode the INTEGER_CST
7289    specified by EXPR into the buffer PTR of length LEN bytes.
7290    Return the number of bytes placed in the buffer, or zero
7291    upon failure.  */
7292
7293 static int
7294 native_encode_int (const_tree expr, unsigned char *ptr, int len, int off)
7295 {
7296   tree type = TREE_TYPE (expr);
7297   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7298   int byte, offset, word, words;
7299   unsigned char value;
7300
7301   if ((off == -1 && total_bytes > len)
7302       || off >= total_bytes)
7303     return 0;
7304   if (off == -1)
7305     off = 0;
7306   words = total_bytes / UNITS_PER_WORD;
7307
7308   for (byte = 0; byte < total_bytes; byte++)
7309     {
7310       int bitpos = byte * BITS_PER_UNIT;
7311       /* Extend EXPR according to TYPE_SIGN if the precision isn't a whole
7312          number of bytes.  */
7313       value = wi::extract_uhwi (wi::to_widest (expr), bitpos, BITS_PER_UNIT);
7314
7315       if (total_bytes > UNITS_PER_WORD)
7316         {
7317           word = byte / UNITS_PER_WORD;
7318           if (WORDS_BIG_ENDIAN)
7319             word = (words - 1) - word;
7320           offset = word * UNITS_PER_WORD;
7321           if (BYTES_BIG_ENDIAN)
7322             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7323           else
7324             offset += byte % UNITS_PER_WORD;
7325         }
7326       else
7327         offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
7328       if (offset >= off
7329           && offset - off < len)
7330         ptr[offset - off] = value;
7331     }
7332   return MIN (len, total_bytes - off);
7333 }
7334
7335
7336 /* Subroutine of native_encode_expr.  Encode the FIXED_CST
7337    specified by EXPR into the buffer PTR of length LEN bytes.
7338    Return the number of bytes placed in the buffer, or zero
7339    upon failure.  */
7340
7341 static int
7342 native_encode_fixed (const_tree expr, unsigned char *ptr, int len, int off)
7343 {
7344   tree type = TREE_TYPE (expr);
7345   machine_mode mode = TYPE_MODE (type);
7346   int total_bytes = GET_MODE_SIZE (mode);
7347   FIXED_VALUE_TYPE value;
7348   tree i_value, i_type;
7349
7350   if (total_bytes * BITS_PER_UNIT > HOST_BITS_PER_DOUBLE_INT)
7351     return 0;
7352
7353   i_type = lang_hooks.types.type_for_size (GET_MODE_BITSIZE (mode), 1);
7354
7355   if (NULL_TREE == i_type
7356       || TYPE_PRECISION (i_type) != total_bytes)
7357     return 0;
7358   
7359   value = TREE_FIXED_CST (expr);
7360   i_value = double_int_to_tree (i_type, value.data);
7361
7362   return native_encode_int (i_value, ptr, len, off);
7363 }
7364
7365
7366 /* Subroutine of native_encode_expr.  Encode the REAL_CST
7367    specified by EXPR into the buffer PTR of length LEN bytes.
7368    Return the number of bytes placed in the buffer, or zero
7369    upon failure.  */
7370
7371 static int
7372 native_encode_real (const_tree expr, unsigned char *ptr, int len, int off)
7373 {
7374   tree type = TREE_TYPE (expr);
7375   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7376   int byte, offset, word, words, bitpos;
7377   unsigned char value;
7378
7379   /* There are always 32 bits in each long, no matter the size of
7380      the hosts long.  We handle floating point representations with
7381      up to 192 bits.  */
7382   long tmp[6];
7383
7384   if ((off == -1 && total_bytes > len)
7385       || off >= total_bytes)
7386     return 0;
7387   if (off == -1)
7388     off = 0;
7389   words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
7390
7391   real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
7392
7393   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7394        bitpos += BITS_PER_UNIT)
7395     {
7396       byte = (bitpos / BITS_PER_UNIT) & 3;
7397       value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
7398
7399       if (UNITS_PER_WORD < 4)
7400         {
7401           word = byte / UNITS_PER_WORD;
7402           if (WORDS_BIG_ENDIAN)
7403             word = (words - 1) - word;
7404           offset = word * UNITS_PER_WORD;
7405           if (BYTES_BIG_ENDIAN)
7406             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7407           else
7408             offset += byte % UNITS_PER_WORD;
7409         }
7410       else
7411         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7412       offset = offset + ((bitpos / BITS_PER_UNIT) & ~3);
7413       if (offset >= off
7414           && offset - off < len)
7415         ptr[offset - off] = value;
7416     }
7417   return MIN (len, total_bytes - off);
7418 }
7419
7420 /* Subroutine of native_encode_expr.  Encode the COMPLEX_CST
7421    specified by EXPR into the buffer PTR of length LEN bytes.
7422    Return the number of bytes placed in the buffer, or zero
7423    upon failure.  */
7424
7425 static int
7426 native_encode_complex (const_tree expr, unsigned char *ptr, int len, int off)
7427 {
7428   int rsize, isize;
7429   tree part;
7430
7431   part = TREE_REALPART (expr);
7432   rsize = native_encode_expr (part, ptr, len, off);
7433   if (off == -1
7434       && rsize == 0)
7435     return 0;
7436   part = TREE_IMAGPART (expr);
7437   if (off != -1)
7438     off = MAX (0, off - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (part))));
7439   isize = native_encode_expr (part, ptr+rsize, len-rsize, off);
7440   if (off == -1
7441       && isize != rsize)
7442     return 0;
7443   return rsize + isize;
7444 }
7445
7446
7447 /* Subroutine of native_encode_expr.  Encode the VECTOR_CST
7448    specified by EXPR into the buffer PTR of length LEN bytes.
7449    Return the number of bytes placed in the buffer, or zero
7450    upon failure.  */
7451
7452 static int
7453 native_encode_vector (const_tree expr, unsigned char *ptr, int len, int off)
7454 {
7455   unsigned i, count;
7456   int size, offset;
7457   tree itype, elem;
7458
7459   offset = 0;
7460   count = VECTOR_CST_NELTS (expr);
7461   itype = TREE_TYPE (TREE_TYPE (expr));
7462   size = GET_MODE_SIZE (TYPE_MODE (itype));
7463   for (i = 0; i < count; i++)
7464     {
7465       if (off >= size)
7466         {
7467           off -= size;
7468           continue;
7469         }
7470       elem = VECTOR_CST_ELT (expr, i);
7471       int res = native_encode_expr (elem, ptr+offset, len-offset, off);
7472       if ((off == -1 && res != size)
7473           || res == 0)
7474         return 0;
7475       offset += res;
7476       if (offset >= len)
7477         return offset;
7478       if (off != -1)
7479         off = 0;
7480     }
7481   return offset;
7482 }
7483
7484
7485 /* Subroutine of native_encode_expr.  Encode the STRING_CST
7486    specified by EXPR into the buffer PTR of length LEN bytes.
7487    Return the number of bytes placed in the buffer, or zero
7488    upon failure.  */
7489
7490 static int
7491 native_encode_string (const_tree expr, unsigned char *ptr, int len, int off)
7492 {
7493   tree type = TREE_TYPE (expr);
7494   HOST_WIDE_INT total_bytes;
7495
7496   if (TREE_CODE (type) != ARRAY_TYPE
7497       || TREE_CODE (TREE_TYPE (type)) != INTEGER_TYPE
7498       || GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (type))) != BITS_PER_UNIT
7499       || !tree_fits_shwi_p (TYPE_SIZE_UNIT (type)))
7500     return 0;
7501   total_bytes = tree_to_shwi (TYPE_SIZE_UNIT (type));
7502   if ((off == -1 && total_bytes > len)
7503       || off >= total_bytes)
7504     return 0;
7505   if (off == -1)
7506     off = 0;
7507   if (TREE_STRING_LENGTH (expr) - off < MIN (total_bytes, len))
7508     {
7509       int written = 0;
7510       if (off < TREE_STRING_LENGTH (expr))
7511         {
7512           written = MIN (len, TREE_STRING_LENGTH (expr) - off);
7513           memcpy (ptr, TREE_STRING_POINTER (expr) + off, written);
7514         }
7515       memset (ptr + written, 0,
7516               MIN (total_bytes - written, len - written));
7517     }
7518   else
7519     memcpy (ptr, TREE_STRING_POINTER (expr) + off, MIN (total_bytes, len));
7520   return MIN (total_bytes - off, len);
7521 }
7522
7523
7524 /* Subroutine of fold_view_convert_expr.  Encode the INTEGER_CST,
7525    REAL_CST, COMPLEX_CST or VECTOR_CST specified by EXPR into the
7526    buffer PTR of length LEN bytes.  If OFF is not -1 then start
7527    the encoding at byte offset OFF and encode at most LEN bytes.
7528    Return the number of bytes placed in the buffer, or zero upon failure.  */
7529
7530 int
7531 native_encode_expr (const_tree expr, unsigned char *ptr, int len, int off)
7532 {
7533   switch (TREE_CODE (expr))
7534     {
7535     case INTEGER_CST:
7536       return native_encode_int (expr, ptr, len, off);
7537
7538     case REAL_CST:
7539       return native_encode_real (expr, ptr, len, off);
7540
7541     case FIXED_CST:
7542       return native_encode_fixed (expr, ptr, len, off);
7543
7544     case COMPLEX_CST:
7545       return native_encode_complex (expr, ptr, len, off);
7546
7547     case VECTOR_CST:
7548       return native_encode_vector (expr, ptr, len, off);
7549
7550     case STRING_CST:
7551       return native_encode_string (expr, ptr, len, off);
7552
7553     default:
7554       return 0;
7555     }
7556 }
7557
7558
7559 /* Subroutine of native_interpret_expr.  Interpret the contents of
7560    the buffer PTR of length LEN as an INTEGER_CST of type TYPE.
7561    If the buffer cannot be interpreted, return NULL_TREE.  */
7562
7563 static tree
7564 native_interpret_int (tree type, const unsigned char *ptr, int len)
7565 {
7566   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7567
7568   if (total_bytes > len
7569       || total_bytes * BITS_PER_UNIT > HOST_BITS_PER_DOUBLE_INT)
7570     return NULL_TREE;
7571
7572   wide_int result = wi::from_buffer (ptr, total_bytes);
7573
7574   return wide_int_to_tree (type, result);
7575 }
7576
7577
7578 /* Subroutine of native_interpret_expr.  Interpret the contents of
7579    the buffer PTR of length LEN as a FIXED_CST of type TYPE.
7580    If the buffer cannot be interpreted, return NULL_TREE.  */
7581
7582 static tree
7583 native_interpret_fixed (tree type, const unsigned char *ptr, int len)
7584 {
7585   int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7586   double_int result;
7587   FIXED_VALUE_TYPE fixed_value;
7588
7589   if (total_bytes > len
7590       || total_bytes * BITS_PER_UNIT > HOST_BITS_PER_DOUBLE_INT)
7591     return NULL_TREE;
7592
7593   result = double_int::from_buffer (ptr, total_bytes);
7594   fixed_value = fixed_from_double_int (result, TYPE_MODE (type));
7595
7596   return build_fixed (type, fixed_value);
7597 }
7598
7599
7600 /* Subroutine of native_interpret_expr.  Interpret the contents of
7601    the buffer PTR of length LEN as a REAL_CST of type TYPE.
7602    If the buffer cannot be interpreted, return NULL_TREE.  */
7603
7604 static tree
7605 native_interpret_real (tree type, const unsigned char *ptr, int len)
7606 {
7607   machine_mode mode = TYPE_MODE (type);
7608   int total_bytes = GET_MODE_SIZE (mode);
7609   int byte, offset, word, words, bitpos;
7610   unsigned char value;
7611   /* There are always 32 bits in each long, no matter the size of
7612      the hosts long.  We handle floating point representations with
7613      up to 192 bits.  */
7614   REAL_VALUE_TYPE r;
7615   long tmp[6];
7616
7617   total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
7618   if (total_bytes > len || total_bytes > 24)
7619     return NULL_TREE;
7620   words = (32 / BITS_PER_UNIT) / UNITS_PER_WORD;
7621
7622   memset (tmp, 0, sizeof (tmp));
7623   for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
7624        bitpos += BITS_PER_UNIT)
7625     {
7626       byte = (bitpos / BITS_PER_UNIT) & 3;
7627       if (UNITS_PER_WORD < 4)
7628         {
7629           word = byte / UNITS_PER_WORD;
7630           if (WORDS_BIG_ENDIAN)
7631             word = (words - 1) - word;
7632           offset = word * UNITS_PER_WORD;
7633           if (BYTES_BIG_ENDIAN)
7634             offset += (UNITS_PER_WORD - 1) - (byte % UNITS_PER_WORD);
7635           else
7636             offset += byte % UNITS_PER_WORD;
7637         }
7638       else
7639         offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
7640       value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
7641
7642       tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
7643     }
7644
7645   real_from_target (&r, tmp, mode);
7646   return build_real (type, r);
7647 }
7648
7649
7650 /* Subroutine of native_interpret_expr.  Interpret the contents of
7651    the buffer PTR of length LEN as a COMPLEX_CST of type TYPE.
7652    If the buffer cannot be interpreted, return NULL_TREE.  */
7653
7654 static tree
7655 native_interpret_complex (tree type, const unsigned char *ptr, int len)
7656 {
7657   tree etype, rpart, ipart;
7658   int size;
7659
7660   etype = TREE_TYPE (type);
7661   size = GET_MODE_SIZE (TYPE_MODE (etype));
7662   if (size * 2 > len)
7663     return NULL_TREE;
7664   rpart = native_interpret_expr (etype, ptr, size);
7665   if (!rpart)
7666     return NULL_TREE;
7667   ipart = native_interpret_expr (etype, ptr+size, size);
7668   if (!ipart)
7669     return NULL_TREE;
7670   return build_complex (type, rpart, ipart);
7671 }
7672
7673
7674 /* Subroutine of native_interpret_expr.  Interpret the contents of
7675    the buffer PTR of length LEN as a VECTOR_CST of type TYPE.
7676    If the buffer cannot be interpreted, return NULL_TREE.  */
7677
7678 static tree
7679 native_interpret_vector (tree type, const unsigned char *ptr, int len)
7680 {
7681   tree etype, elem;
7682   int i, size, count;
7683   tree *elements;
7684
7685   etype = TREE_TYPE (type);
7686   size = GET_MODE_SIZE (TYPE_MODE (etype));
7687   count = TYPE_VECTOR_SUBPARTS (type);
7688   if (size * count > len)
7689     return NULL_TREE;
7690
7691   elements = XALLOCAVEC (tree, count);
7692   for (i = count - 1; i >= 0; i--)
7693     {
7694       elem = native_interpret_expr (etype, ptr+(i*size), size);
7695       if (!elem)
7696         return NULL_TREE;
7697       elements[i] = elem;
7698     }
7699   return build_vector (type, elements);
7700 }
7701
7702
7703 /* Subroutine of fold_view_convert_expr.  Interpret the contents of
7704    the buffer PTR of length LEN as a constant of type TYPE.  For
7705    INTEGRAL_TYPE_P we return an INTEGER_CST, for SCALAR_FLOAT_TYPE_P
7706    we return a REAL_CST, etc...  If the buffer cannot be interpreted,
7707    return NULL_TREE.  */
7708
7709 tree
7710 native_interpret_expr (tree type, const unsigned char *ptr, int len)
7711 {
7712   switch (TREE_CODE (type))
7713     {
7714     case INTEGER_TYPE:
7715     case ENUMERAL_TYPE:
7716     case BOOLEAN_TYPE:
7717     case POINTER_TYPE:
7718     case REFERENCE_TYPE:
7719       return native_interpret_int (type, ptr, len);
7720
7721     case REAL_TYPE:
7722       return native_interpret_real (type, ptr, len);
7723
7724     case FIXED_POINT_TYPE:
7725       return native_interpret_fixed (type, ptr, len);
7726
7727     case COMPLEX_TYPE:
7728       return native_interpret_complex (type, ptr, len);
7729
7730     case VECTOR_TYPE:
7731       return native_interpret_vector (type, ptr, len);
7732
7733     default:
7734       return NULL_TREE;
7735     }
7736 }
7737
7738 /* Returns true if we can interpret the contents of a native encoding
7739    as TYPE.  */
7740
7741 static bool
7742 can_native_interpret_type_p (tree type)
7743 {
7744   switch (TREE_CODE (type))
7745     {
7746     case INTEGER_TYPE:
7747     case ENUMERAL_TYPE:
7748     case BOOLEAN_TYPE:
7749     case POINTER_TYPE:
7750     case REFERENCE_TYPE:
7751     case FIXED_POINT_TYPE:
7752     case REAL_TYPE:
7753     case COMPLEX_TYPE:
7754     case VECTOR_TYPE:
7755       return true;
7756     default:
7757       return false;
7758     }
7759 }
7760
7761 /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type
7762    TYPE at compile-time.  If we're unable to perform the conversion
7763    return NULL_TREE.  */
7764
7765 static tree
7766 fold_view_convert_expr (tree type, tree expr)
7767 {
7768   /* We support up to 512-bit values (for V8DFmode).  */
7769   unsigned char buffer[64];
7770   int len;
7771
7772   /* Check that the host and target are sane.  */
7773   if (CHAR_BIT != 8 || BITS_PER_UNIT != 8)
7774     return NULL_TREE;
7775
7776   len = native_encode_expr (expr, buffer, sizeof (buffer));
7777   if (len == 0)
7778     return NULL_TREE;
7779
7780   return native_interpret_expr (type, buffer, len);
7781 }
7782
7783 /* Build an expression for the address of T.  Folds away INDIRECT_REF
7784    to avoid confusing the gimplify process.  */
7785
7786 tree
7787 build_fold_addr_expr_with_type_loc (location_t loc, tree t, tree ptrtype)
7788 {
7789   /* The size of the object is not relevant when talking about its address.  */
7790   if (TREE_CODE (t) == WITH_SIZE_EXPR)
7791     t = TREE_OPERAND (t, 0);
7792
7793   if (TREE_CODE (t) == INDIRECT_REF)
7794     {
7795       t = TREE_OPERAND (t, 0);
7796
7797       if (TREE_TYPE (t) != ptrtype)
7798         t = build1_loc (loc, NOP_EXPR, ptrtype, t);
7799     }
7800   else if (TREE_CODE (t) == MEM_REF
7801            && integer_zerop (TREE_OPERAND (t, 1)))
7802     return TREE_OPERAND (t, 0);
7803   else if (TREE_CODE (t) == MEM_REF
7804            && TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST)
7805     return fold_binary (POINTER_PLUS_EXPR, ptrtype,
7806                         TREE_OPERAND (t, 0),
7807                         convert_to_ptrofftype (TREE_OPERAND (t, 1)));
7808   else if (TREE_CODE (t) == VIEW_CONVERT_EXPR)
7809     {
7810       t = build_fold_addr_expr_loc (loc, TREE_OPERAND (t, 0));
7811
7812       if (TREE_TYPE (t) != ptrtype)
7813         t = fold_convert_loc (loc, ptrtype, t);
7814     }
7815   else
7816     t = build1_loc (loc, ADDR_EXPR, ptrtype, t);
7817
7818   return t;
7819 }
7820
7821 /* Build an expression for the address of T.  */
7822
7823 tree
7824 build_fold_addr_expr_loc (location_t loc, tree t)
7825 {
7826   tree ptrtype = build_pointer_type (TREE_TYPE (t));
7827
7828   return build_fold_addr_expr_with_type_loc (loc, t, ptrtype);
7829 }
7830
7831 /* Fold a unary expression of code CODE and type TYPE with operand
7832    OP0.  Return the folded expression if folding is successful.
7833    Otherwise, return NULL_TREE.  */
7834
7835 tree
7836 fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
7837 {
7838   tree tem;
7839   tree arg0;
7840   enum tree_code_class kind = TREE_CODE_CLASS (code);
7841
7842   gcc_assert (IS_EXPR_CODE_CLASS (kind)
7843               && TREE_CODE_LENGTH (code) == 1);
7844
7845   arg0 = op0;
7846   if (arg0)
7847     {
7848       if (CONVERT_EXPR_CODE_P (code)
7849           || code == FLOAT_EXPR || code == ABS_EXPR || code == NEGATE_EXPR)
7850         {
7851           /* Don't use STRIP_NOPS, because signedness of argument type
7852              matters.  */
7853           STRIP_SIGN_NOPS (arg0);
7854         }
7855       else
7856         {
7857           /* Strip any conversions that don't change the mode.  This
7858              is safe for every expression, except for a comparison
7859              expression because its signedness is derived from its
7860              operands.
7861
7862              Note that this is done as an internal manipulation within
7863              the constant folder, in order to find the simplest
7864              representation of the arguments so that their form can be
7865              studied.  In any cases, the appropriate type conversions
7866              should be put back in the tree that will get out of the
7867              constant folder.  */
7868           STRIP_NOPS (arg0);
7869         }
7870
7871       if (CONSTANT_CLASS_P (arg0))
7872         {
7873           tree tem = const_unop (code, type, arg0);
7874           if (tem)
7875             {
7876               if (TREE_TYPE (tem) != type)
7877                 tem = fold_convert_loc (loc, type, tem);
7878               return tem;
7879             }
7880         }
7881     }
7882
7883   tem = generic_simplify (loc, code, type, op0);
7884   if (tem)
7885     return tem;
7886
7887   if (TREE_CODE_CLASS (code) == tcc_unary)
7888     {
7889       if (TREE_CODE (arg0) == COMPOUND_EXPR)
7890         return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
7891                        fold_build1_loc (loc, code, type,
7892                                     fold_convert_loc (loc, TREE_TYPE (op0),
7893                                                       TREE_OPERAND (arg0, 1))));
7894       else if (TREE_CODE (arg0) == COND_EXPR)
7895         {
7896           tree arg01 = TREE_OPERAND (arg0, 1);
7897           tree arg02 = TREE_OPERAND (arg0, 2);
7898           if (! VOID_TYPE_P (TREE_TYPE (arg01)))
7899             arg01 = fold_build1_loc (loc, code, type,
7900                                  fold_convert_loc (loc,
7901                                                    TREE_TYPE (op0), arg01));
7902           if (! VOID_TYPE_P (TREE_TYPE (arg02)))
7903             arg02 = fold_build1_loc (loc, code, type,
7904                                  fold_convert_loc (loc,
7905                                                    TREE_TYPE (op0), arg02));
7906           tem = fold_build3_loc (loc, COND_EXPR, type, TREE_OPERAND (arg0, 0),
7907                              arg01, arg02);
7908
7909           /* If this was a conversion, and all we did was to move into
7910              inside the COND_EXPR, bring it back out.  But leave it if
7911              it is a conversion from integer to integer and the
7912              result precision is no wider than a word since such a
7913              conversion is cheap and may be optimized away by combine,
7914              while it couldn't if it were outside the COND_EXPR.  Then return
7915              so we don't get into an infinite recursion loop taking the
7916              conversion out and then back in.  */
7917
7918           if ((CONVERT_EXPR_CODE_P (code)
7919                || code == NON_LVALUE_EXPR)
7920               && TREE_CODE (tem) == COND_EXPR
7921               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
7922               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
7923               && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
7924               && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
7925               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
7926                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
7927               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
7928                      && (INTEGRAL_TYPE_P
7929                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))))
7930                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
7931                   || flag_syntax_only))
7932             tem = build1_loc (loc, code, type,
7933                               build3 (COND_EXPR,
7934                                       TREE_TYPE (TREE_OPERAND
7935                                                  (TREE_OPERAND (tem, 1), 0)),
7936                                       TREE_OPERAND (tem, 0),
7937                                       TREE_OPERAND (TREE_OPERAND (tem, 1), 0),
7938                                       TREE_OPERAND (TREE_OPERAND (tem, 2),
7939                                                     0)));
7940           return tem;
7941         }
7942    }
7943
7944   switch (code)
7945     {
7946     case NON_LVALUE_EXPR:
7947       if (!maybe_lvalue_p (op0))
7948         return fold_convert_loc (loc, type, op0);
7949       return NULL_TREE;
7950
7951     CASE_CONVERT:
7952     case FLOAT_EXPR:
7953     case FIX_TRUNC_EXPR:
7954       if (COMPARISON_CLASS_P (op0))
7955         {
7956           /* If we have (type) (a CMP b) and type is an integral type, return
7957              new expression involving the new type.  Canonicalize
7958              (type) (a CMP b) to (a CMP b) ? (type) true : (type) false for
7959              non-integral type.
7960              Do not fold the result as that would not simplify further, also
7961              folding again results in recursions.  */
7962           if (TREE_CODE (type) == BOOLEAN_TYPE)
7963             return build2_loc (loc, TREE_CODE (op0), type,
7964                                TREE_OPERAND (op0, 0),
7965                                TREE_OPERAND (op0, 1));
7966           else if (!INTEGRAL_TYPE_P (type) && !VOID_TYPE_P (type)
7967                    && TREE_CODE (type) != VECTOR_TYPE)
7968             return build3_loc (loc, COND_EXPR, type, op0,
7969                                constant_boolean_node (true, type),
7970                                constant_boolean_node (false, type));
7971         }
7972
7973       /* Handle (T *)&A.B.C for A being of type T and B and C
7974          living at offset zero.  This occurs frequently in
7975          C++ upcasting and then accessing the base.  */
7976       if (TREE_CODE (op0) == ADDR_EXPR
7977           && POINTER_TYPE_P (type)
7978           && handled_component_p (TREE_OPERAND (op0, 0)))
7979         {
7980           HOST_WIDE_INT bitsize, bitpos;
7981           tree offset;
7982           machine_mode mode;
7983           int unsignedp, volatilep;
7984           tree base = TREE_OPERAND (op0, 0);
7985           base = get_inner_reference (base, &bitsize, &bitpos, &offset,
7986                                       &mode, &unsignedp, &volatilep, false);
7987           /* If the reference was to a (constant) zero offset, we can use
7988              the address of the base if it has the same base type
7989              as the result type and the pointer type is unqualified.  */
7990           if (! offset && bitpos == 0
7991               && (TYPE_MAIN_VARIANT (TREE_TYPE (type))
7992                   == TYPE_MAIN_VARIANT (TREE_TYPE (base)))
7993               && TYPE_QUALS (type) == TYPE_UNQUALIFIED)
7994             return fold_convert_loc (loc, type,
7995                                      build_fold_addr_expr_loc (loc, base));
7996         }
7997
7998       if (TREE_CODE (op0) == MODIFY_EXPR
7999           && TREE_CONSTANT (TREE_OPERAND (op0, 1))
8000           /* Detect assigning a bitfield.  */
8001           && !(TREE_CODE (TREE_OPERAND (op0, 0)) == COMPONENT_REF
8002                && DECL_BIT_FIELD
8003                (TREE_OPERAND (TREE_OPERAND (op0, 0), 1))))
8004         {
8005           /* Don't leave an assignment inside a conversion
8006              unless assigning a bitfield.  */
8007           tem = fold_build1_loc (loc, code, type, TREE_OPERAND (op0, 1));
8008           /* First do the assignment, then return converted constant.  */
8009           tem = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
8010           TREE_NO_WARNING (tem) = 1;
8011           TREE_USED (tem) = 1;
8012           return tem;
8013         }
8014
8015       /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer
8016          constants (if x has signed type, the sign bit cannot be set
8017          in c).  This folds extension into the BIT_AND_EXPR.
8018          ??? We don't do it for BOOLEAN_TYPE or ENUMERAL_TYPE because they
8019          very likely don't have maximal range for their precision and this
8020          transformation effectively doesn't preserve non-maximal ranges.  */
8021       if (TREE_CODE (type) == INTEGER_TYPE
8022           && TREE_CODE (op0) == BIT_AND_EXPR
8023           && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST)
8024         {
8025           tree and_expr = op0;
8026           tree and0 = TREE_OPERAND (and_expr, 0);
8027           tree and1 = TREE_OPERAND (and_expr, 1);
8028           int change = 0;
8029
8030           if (TYPE_UNSIGNED (TREE_TYPE (and_expr))
8031               || (TYPE_PRECISION (type)
8032                   <= TYPE_PRECISION (TREE_TYPE (and_expr))))
8033             change = 1;
8034           else if (TYPE_PRECISION (TREE_TYPE (and1))
8035                    <= HOST_BITS_PER_WIDE_INT
8036                    && tree_fits_uhwi_p (and1))
8037             {
8038               unsigned HOST_WIDE_INT cst;
8039
8040               cst = tree_to_uhwi (and1);
8041               cst &= HOST_WIDE_INT_M1U
8042                      << (TYPE_PRECISION (TREE_TYPE (and1)) - 1);
8043               change = (cst == 0);
8044 #ifdef LOAD_EXTEND_OP
8045               if (change
8046                   && !flag_syntax_only
8047                   && (LOAD_EXTEND_OP (TYPE_MODE (TREE_TYPE (and0)))
8048                       == ZERO_EXTEND))
8049                 {
8050                   tree uns = unsigned_type_for (TREE_TYPE (and0));
8051                   and0 = fold_convert_loc (loc, uns, and0);
8052                   and1 = fold_convert_loc (loc, uns, and1);
8053                 }
8054 #endif
8055             }
8056           if (change)
8057             {
8058               tem = force_fit_type (type, wi::to_widest (and1), 0,
8059                                     TREE_OVERFLOW (and1));
8060               return fold_build2_loc (loc, BIT_AND_EXPR, type,
8061                                       fold_convert_loc (loc, type, and0), tem);
8062             }
8063         }
8064
8065       /* Convert (T1)(X p+ Y) into ((T1)X p+ Y), for pointer type,
8066          when one of the new casts will fold away. Conservatively we assume
8067          that this happens when X or Y is NOP_EXPR or Y is INTEGER_CST. */
8068       if (POINTER_TYPE_P (type)
8069           && TREE_CODE (arg0) == POINTER_PLUS_EXPR
8070           && (!TYPE_RESTRICT (type) || TYPE_RESTRICT (TREE_TYPE (arg0)))
8071           && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8072               || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
8073               || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR))
8074         {
8075           tree arg00 = TREE_OPERAND (arg0, 0);
8076           tree arg01 = TREE_OPERAND (arg0, 1);
8077
8078           return fold_build_pointer_plus_loc
8079                    (loc, fold_convert_loc (loc, type, arg00), arg01);
8080         }
8081
8082       /* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types
8083          of the same precision, and X is an integer type not narrower than
8084          types T1 or T2, i.e. the cast (T2)X isn't an extension.  */
8085       if (INTEGRAL_TYPE_P (type)
8086           && TREE_CODE (op0) == BIT_NOT_EXPR
8087           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
8088           && CONVERT_EXPR_P (TREE_OPERAND (op0, 0))
8089           && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)))
8090         {
8091           tem = TREE_OPERAND (TREE_OPERAND (op0, 0), 0);
8092           if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
8093               && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (tem)))
8094             return fold_build1_loc (loc, BIT_NOT_EXPR, type,
8095                                 fold_convert_loc (loc, type, tem));
8096         }
8097
8098       /* Convert (T1)(X * Y) into (T1)X * (T1)Y if T1 is narrower than the
8099          type of X and Y (integer types only).  */
8100       if (INTEGRAL_TYPE_P (type)
8101           && TREE_CODE (op0) == MULT_EXPR
8102           && INTEGRAL_TYPE_P (TREE_TYPE (op0))
8103           && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (op0)))
8104         {
8105           /* Be careful not to introduce new overflows.  */
8106           tree mult_type;
8107           if (TYPE_OVERFLOW_WRAPS (type))
8108             mult_type = type;
8109           else
8110             mult_type = unsigned_type_for (type);
8111
8112           if (TYPE_PRECISION (mult_type) < TYPE_PRECISION (TREE_TYPE (op0)))
8113             {
8114               tem = fold_build2_loc (loc, MULT_EXPR, mult_type,
8115                                  fold_convert_loc (loc, mult_type,
8116                                                    TREE_OPERAND (op0, 0)),
8117                                  fold_convert_loc (loc, mult_type,
8118                                                    TREE_OPERAND (op0, 1)));
8119               return fold_convert_loc (loc, type, tem);
8120             }
8121         }
8122
8123       return NULL_TREE;
8124
8125     case VIEW_CONVERT_EXPR:
8126       if (TREE_CODE (op0) == MEM_REF)
8127         return fold_build2_loc (loc, MEM_REF, type,
8128                                 TREE_OPERAND (op0, 0), TREE_OPERAND (op0, 1));
8129
8130       return NULL_TREE;
8131
8132     case NEGATE_EXPR:
8133       tem = fold_negate_expr (loc, arg0);
8134       if (tem)
8135         return fold_convert_loc (loc, type, tem);
8136       return NULL_TREE;
8137
8138     case ABS_EXPR:
8139       /* Convert fabs((double)float) into (double)fabsf(float).  */
8140       if (TREE_CODE (arg0) == NOP_EXPR
8141           && TREE_CODE (type) == REAL_TYPE)
8142         {
8143           tree targ0 = strip_float_extensions (arg0);
8144           if (targ0 != arg0)
8145             return fold_convert_loc (loc, type,
8146                                      fold_build1_loc (loc, ABS_EXPR,
8147                                                   TREE_TYPE (targ0),
8148                                                   targ0));
8149         }
8150       /* ABS_EXPR<ABS_EXPR<x>> = ABS_EXPR<x> even if flag_wrapv is on.  */
8151       else if (TREE_CODE (arg0) == ABS_EXPR)
8152         return arg0;
8153
8154       /* Strip sign ops from argument.  */
8155       if (TREE_CODE (type) == REAL_TYPE)
8156         {
8157           tem = fold_strip_sign_ops (arg0);
8158           if (tem)
8159             return fold_build1_loc (loc, ABS_EXPR, type,
8160                                 fold_convert_loc (loc, type, tem));
8161         }
8162       return NULL_TREE;
8163
8164     case CONJ_EXPR:
8165       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8166         return fold_convert_loc (loc, type, arg0);
8167       if (TREE_CODE (arg0) == COMPLEX_EXPR)
8168         {
8169           tree itype = TREE_TYPE (type);
8170           tree rpart = fold_convert_loc (loc, itype, TREE_OPERAND (arg0, 0));
8171           tree ipart = fold_convert_loc (loc, itype, TREE_OPERAND (arg0, 1));
8172           return fold_build2_loc (loc, COMPLEX_EXPR, type, rpart,
8173                               negate_expr (ipart));
8174         }
8175       if (TREE_CODE (arg0) == CONJ_EXPR)
8176         return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
8177       return NULL_TREE;
8178
8179     case BIT_NOT_EXPR:
8180       /* Convert ~ (-A) to A - 1.  */
8181       if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
8182         return fold_build2_loc (loc, MINUS_EXPR, type,
8183                             fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0)),
8184                             build_int_cst (type, 1));
8185       /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
8186       else if (INTEGRAL_TYPE_P (type)
8187                && ((TREE_CODE (arg0) == MINUS_EXPR
8188                     && integer_onep (TREE_OPERAND (arg0, 1)))
8189                    || (TREE_CODE (arg0) == PLUS_EXPR
8190                        && integer_all_onesp (TREE_OPERAND (arg0, 1)))))
8191         {
8192           /* Perform the negation in ARG0's type and only then convert
8193              to TYPE as to avoid introducing undefined behavior.  */
8194           tree t = fold_build1_loc (loc, NEGATE_EXPR,
8195                                     TREE_TYPE (TREE_OPERAND (arg0, 0)),
8196                                     TREE_OPERAND (arg0, 0));
8197           return fold_convert_loc (loc, type, t);
8198         }
8199       /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
8200       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8201                && (tem = fold_unary_loc (loc, BIT_NOT_EXPR, type,
8202                                      fold_convert_loc (loc, type,
8203                                                        TREE_OPERAND (arg0, 0)))))
8204         return fold_build2_loc (loc, BIT_XOR_EXPR, type, tem,
8205                             fold_convert_loc (loc, type,
8206                                               TREE_OPERAND (arg0, 1)));
8207       else if (TREE_CODE (arg0) == BIT_XOR_EXPR
8208                && (tem = fold_unary_loc (loc, BIT_NOT_EXPR, type,
8209                                      fold_convert_loc (loc, type,
8210                                                        TREE_OPERAND (arg0, 1)))))
8211         return fold_build2_loc (loc, BIT_XOR_EXPR, type,
8212                             fold_convert_loc (loc, type,
8213                                               TREE_OPERAND (arg0, 0)), tem);
8214
8215       return NULL_TREE;
8216
8217     case TRUTH_NOT_EXPR:
8218       /* Note that the operand of this must be an int
8219          and its values must be 0 or 1.
8220          ("true" is a fixed value perhaps depending on the language,
8221          but we don't handle values other than 1 correctly yet.)  */
8222       tem = fold_truth_not_expr (loc, arg0);
8223       if (!tem)
8224         return NULL_TREE;
8225       return fold_convert_loc (loc, type, tem);
8226
8227     case REALPART_EXPR:
8228       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8229         return fold_convert_loc (loc, type, arg0);
8230       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8231         {
8232           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8233           tem = fold_build2_loc (loc, TREE_CODE (arg0), itype,
8234                              fold_build1_loc (loc, REALPART_EXPR, itype,
8235                                           TREE_OPERAND (arg0, 0)),
8236                              fold_build1_loc (loc, REALPART_EXPR, itype,
8237                                           TREE_OPERAND (arg0, 1)));
8238           return fold_convert_loc (loc, type, tem);
8239         }
8240       if (TREE_CODE (arg0) == CONJ_EXPR)
8241         {
8242           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8243           tem = fold_build1_loc (loc, REALPART_EXPR, itype,
8244                              TREE_OPERAND (arg0, 0));
8245           return fold_convert_loc (loc, type, tem);
8246         }
8247       if (TREE_CODE (arg0) == CALL_EXPR)
8248         {
8249           tree fn = get_callee_fndecl (arg0);
8250           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8251             switch (DECL_FUNCTION_CODE (fn))
8252               {
8253               CASE_FLT_FN (BUILT_IN_CEXPI):
8254                 fn = mathfn_built_in (type, BUILT_IN_COS);
8255                 if (fn)
8256                   return build_call_expr_loc (loc, fn, 1, CALL_EXPR_ARG (arg0, 0));
8257                 break;
8258
8259               default:
8260                 break;
8261               }
8262         }
8263       return NULL_TREE;
8264
8265     case IMAGPART_EXPR:
8266       if (TREE_CODE (TREE_TYPE (arg0)) != COMPLEX_TYPE)
8267         return build_zero_cst (type);
8268       if (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8269         {
8270           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8271           tem = fold_build2_loc (loc, TREE_CODE (arg0), itype,
8272                              fold_build1_loc (loc, IMAGPART_EXPR, itype,
8273                                           TREE_OPERAND (arg0, 0)),
8274                              fold_build1_loc (loc, IMAGPART_EXPR, itype,
8275                                           TREE_OPERAND (arg0, 1)));
8276           return fold_convert_loc (loc, type, tem);
8277         }
8278       if (TREE_CODE (arg0) == CONJ_EXPR)
8279         {
8280           tree itype = TREE_TYPE (TREE_TYPE (arg0));
8281           tem = fold_build1_loc (loc, IMAGPART_EXPR, itype, TREE_OPERAND (arg0, 0));
8282           return fold_convert_loc (loc, type, negate_expr (tem));
8283         }
8284       if (TREE_CODE (arg0) == CALL_EXPR)
8285         {
8286           tree fn = get_callee_fndecl (arg0);
8287           if (fn && DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL)
8288             switch (DECL_FUNCTION_CODE (fn))
8289               {
8290               CASE_FLT_FN (BUILT_IN_CEXPI):
8291                 fn = mathfn_built_in (type, BUILT_IN_SIN);
8292                 if (fn)
8293                   return build_call_expr_loc (loc, fn, 1, CALL_EXPR_ARG (arg0, 0));
8294                 break;
8295
8296               default:
8297                 break;
8298               }
8299         }
8300       return NULL_TREE;
8301
8302     case INDIRECT_REF:
8303       /* Fold *&X to X if X is an lvalue.  */
8304       if (TREE_CODE (op0) == ADDR_EXPR)
8305         {
8306           tree op00 = TREE_OPERAND (op0, 0);
8307           if ((TREE_CODE (op00) == VAR_DECL
8308                || TREE_CODE (op00) == PARM_DECL
8309                || TREE_CODE (op00) == RESULT_DECL)
8310               && !TREE_READONLY (op00))
8311             return op00;
8312         }
8313       return NULL_TREE;
8314
8315     default:
8316       return NULL_TREE;
8317     } /* switch (code) */
8318 }
8319
8320
8321 /* If the operation was a conversion do _not_ mark a resulting constant
8322    with TREE_OVERFLOW if the original constant was not.  These conversions
8323    have implementation defined behavior and retaining the TREE_OVERFLOW
8324    flag here would confuse later passes such as VRP.  */
8325 tree
8326 fold_unary_ignore_overflow_loc (location_t loc, enum tree_code code,
8327                                 tree type, tree op0)
8328 {
8329   tree res = fold_unary_loc (loc, code, type, op0);
8330   if (res
8331       && TREE_CODE (res) == INTEGER_CST
8332       && TREE_CODE (op0) == INTEGER_CST
8333       && CONVERT_EXPR_CODE_P (code))
8334     TREE_OVERFLOW (res) = TREE_OVERFLOW (op0);
8335
8336   return res;
8337 }
8338
8339 /* Fold a binary bitwise/truth expression of code CODE and type TYPE with
8340    operands OP0 and OP1.  LOC is the location of the resulting expression.
8341    ARG0 and ARG1 are the NOP_STRIPed results of OP0 and OP1.
8342    Return the folded expression if folding is successful.  Otherwise,
8343    return NULL_TREE.  */
8344 static tree
8345 fold_truth_andor (location_t loc, enum tree_code code, tree type,
8346                   tree arg0, tree arg1, tree op0, tree op1)
8347 {
8348   tree tem;
8349
8350   /* We only do these simplifications if we are optimizing.  */
8351   if (!optimize)
8352     return NULL_TREE;
8353
8354   /* Check for things like (A || B) && (A || C).  We can convert this
8355      to A || (B && C).  Note that either operator can be any of the four
8356      truth and/or operations and the transformation will still be
8357      valid.   Also note that we only care about order for the
8358      ANDIF and ORIF operators.  If B contains side effects, this
8359      might change the truth-value of A.  */
8360   if (TREE_CODE (arg0) == TREE_CODE (arg1)
8361       && (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
8362           || TREE_CODE (arg0) == TRUTH_ORIF_EXPR
8363           || TREE_CODE (arg0) == TRUTH_AND_EXPR
8364           || TREE_CODE (arg0) == TRUTH_OR_EXPR)
8365       && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
8366     {
8367       tree a00 = TREE_OPERAND (arg0, 0);
8368       tree a01 = TREE_OPERAND (arg0, 1);
8369       tree a10 = TREE_OPERAND (arg1, 0);
8370       tree a11 = TREE_OPERAND (arg1, 1);
8371       int commutative = ((TREE_CODE (arg0) == TRUTH_OR_EXPR
8372                           || TREE_CODE (arg0) == TRUTH_AND_EXPR)
8373                          && (code == TRUTH_AND_EXPR
8374                              || code == TRUTH_OR_EXPR));
8375
8376       if (operand_equal_p (a00, a10, 0))
8377         return fold_build2_loc (loc, TREE_CODE (arg0), type, a00,
8378                             fold_build2_loc (loc, code, type, a01, a11));
8379       else if (commutative && operand_equal_p (a00, a11, 0))
8380         return fold_build2_loc (loc, TREE_CODE (arg0), type, a00,
8381                             fold_build2_loc (loc, code, type, a01, a10));
8382       else if (commutative && operand_equal_p (a01, a10, 0))
8383         return fold_build2_loc (loc, TREE_CODE (arg0), type, a01,
8384                             fold_build2_loc (loc, code, type, a00, a11));
8385
8386       /* This case if tricky because we must either have commutative
8387          operators or else A10 must not have side-effects.  */
8388
8389       else if ((commutative || ! TREE_SIDE_EFFECTS (a10))
8390                && operand_equal_p (a01, a11, 0))
8391         return fold_build2_loc (loc, TREE_CODE (arg0), type,
8392                             fold_build2_loc (loc, code, type, a00, a10),
8393                             a01);
8394     }
8395
8396   /* See if we can build a range comparison.  */
8397   if (0 != (tem = fold_range_test (loc, code, type, op0, op1)))
8398     return tem;
8399
8400   if ((code == TRUTH_ANDIF_EXPR && TREE_CODE (arg0) == TRUTH_ORIF_EXPR)
8401       || (code == TRUTH_ORIF_EXPR && TREE_CODE (arg0) == TRUTH_ANDIF_EXPR))
8402     {
8403       tem = merge_truthop_with_opposite_arm (loc, arg0, arg1, true);
8404       if (tem)
8405         return fold_build2_loc (loc, code, type, tem, arg1);
8406     }
8407
8408   if ((code == TRUTH_ANDIF_EXPR && TREE_CODE (arg1) == TRUTH_ORIF_EXPR)
8409       || (code == TRUTH_ORIF_EXPR && TREE_CODE (arg1) == TRUTH_ANDIF_EXPR))
8410     {
8411       tem = merge_truthop_with_opposite_arm (loc, arg1, arg0, false);
8412       if (tem)
8413         return fold_build2_loc (loc, code, type, arg0, tem);
8414     }
8415
8416   /* Check for the possibility of merging component references.  If our
8417      lhs is another similar operation, try to merge its rhs with our
8418      rhs.  Then try to merge our lhs and rhs.  */
8419   if (TREE_CODE (arg0) == code
8420       && 0 != (tem = fold_truth_andor_1 (loc, code, type,
8421                                          TREE_OPERAND (arg0, 1), arg1)))
8422     return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
8423
8424   if ((tem = fold_truth_andor_1 (loc, code, type, arg0, arg1)) != 0)
8425     return tem;
8426
8427   if (LOGICAL_OP_NON_SHORT_CIRCUIT
8428       && (code == TRUTH_AND_EXPR
8429           || code == TRUTH_ANDIF_EXPR
8430           || code == TRUTH_OR_EXPR
8431           || code == TRUTH_ORIF_EXPR))
8432     {
8433       enum tree_code ncode, icode;
8434
8435       ncode = (code == TRUTH_ANDIF_EXPR || code == TRUTH_AND_EXPR)
8436               ? TRUTH_AND_EXPR : TRUTH_OR_EXPR;
8437       icode = ncode == TRUTH_AND_EXPR ? TRUTH_ANDIF_EXPR : TRUTH_ORIF_EXPR;
8438
8439       /* Transform ((A AND-IF B) AND[-IF] C) into (A AND-IF (B AND C)),
8440          or ((A OR-IF B) OR[-IF] C) into (A OR-IF (B OR C))
8441          We don't want to pack more than two leafs to a non-IF AND/OR
8442          expression.
8443          If tree-code of left-hand operand isn't an AND/OR-IF code and not
8444          equal to IF-CODE, then we don't want to add right-hand operand.
8445          If the inner right-hand side of left-hand operand has
8446          side-effects, or isn't simple, then we can't add to it,
8447          as otherwise we might destroy if-sequence.  */
8448       if (TREE_CODE (arg0) == icode
8449           && simple_operand_p_2 (arg1)
8450           /* Needed for sequence points to handle trappings, and
8451              side-effects.  */
8452           && simple_operand_p_2 (TREE_OPERAND (arg0, 1)))
8453         {
8454           tem = fold_build2_loc (loc, ncode, type, TREE_OPERAND (arg0, 1),
8455                                  arg1);
8456           return fold_build2_loc (loc, icode, type, TREE_OPERAND (arg0, 0),
8457                                   tem);
8458         }
8459         /* Same as abouve but for (A AND[-IF] (B AND-IF C)) -> ((A AND B) AND-IF C),
8460            or (A OR[-IF] (B OR-IF C) -> ((A OR B) OR-IF C).  */
8461       else if (TREE_CODE (arg1) == icode
8462           && simple_operand_p_2 (arg0)
8463           /* Needed for sequence points to handle trappings, and
8464              side-effects.  */
8465           && simple_operand_p_2 (TREE_OPERAND (arg1, 0)))
8466         {
8467           tem = fold_build2_loc (loc, ncode, type, 
8468                                  arg0, TREE_OPERAND (arg1, 0));
8469           return fold_build2_loc (loc, icode, type, tem,
8470                                   TREE_OPERAND (arg1, 1));
8471         }
8472       /* Transform (A AND-IF B) into (A AND B), or (A OR-IF B)
8473          into (A OR B).
8474          For sequence point consistancy, we need to check for trapping,
8475          and side-effects.  */
8476       else if (code == icode && simple_operand_p_2 (arg0)
8477                && simple_operand_p_2 (arg1))
8478         return fold_build2_loc (loc, ncode, type, arg0, arg1);
8479     }
8480
8481   return NULL_TREE;
8482 }
8483
8484 /* Fold a binary expression of code CODE and type TYPE with operands
8485    OP0 and OP1, containing either a MIN-MAX or a MAX-MIN combination.
8486    Return the folded expression if folding is successful.  Otherwise,
8487    return NULL_TREE.  */
8488
8489 static tree
8490 fold_minmax (location_t loc, enum tree_code code, tree type, tree op0, tree op1)
8491 {
8492   enum tree_code compl_code;
8493
8494   if (code == MIN_EXPR)
8495     compl_code = MAX_EXPR;
8496   else if (code == MAX_EXPR)
8497     compl_code = MIN_EXPR;
8498   else
8499     gcc_unreachable ();
8500
8501   /* MIN (MAX (a, b), b) == b.  */
8502   if (TREE_CODE (op0) == compl_code
8503       && operand_equal_p (TREE_OPERAND (op0, 1), op1, 0))
8504     return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 0));
8505
8506   /* MIN (MAX (b, a), b) == b.  */
8507   if (TREE_CODE (op0) == compl_code
8508       && operand_equal_p (TREE_OPERAND (op0, 0), op1, 0)
8509       && reorder_operands_p (TREE_OPERAND (op0, 1), op1))
8510     return omit_one_operand_loc (loc, type, op1, TREE_OPERAND (op0, 1));
8511
8512   /* MIN (a, MAX (a, b)) == a.  */
8513   if (TREE_CODE (op1) == compl_code
8514       && operand_equal_p (op0, TREE_OPERAND (op1, 0), 0)
8515       && reorder_operands_p (op0, TREE_OPERAND (op1, 1)))
8516     return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 1));
8517
8518   /* MIN (a, MAX (b, a)) == a.  */
8519   if (TREE_CODE (op1) == compl_code
8520       && operand_equal_p (op0, TREE_OPERAND (op1, 1), 0)
8521       && reorder_operands_p (op0, TREE_OPERAND (op1, 0)))
8522     return omit_one_operand_loc (loc, type, op0, TREE_OPERAND (op1, 0));
8523
8524   return NULL_TREE;
8525 }
8526
8527 /* Helper that tries to canonicalize the comparison ARG0 CODE ARG1
8528    by changing CODE to reduce the magnitude of constants involved in
8529    ARG0 of the comparison.
8530    Returns a canonicalized comparison tree if a simplification was
8531    possible, otherwise returns NULL_TREE.
8532    Set *STRICT_OVERFLOW_P to true if the canonicalization is only
8533    valid if signed overflow is undefined.  */
8534
8535 static tree
8536 maybe_canonicalize_comparison_1 (location_t loc, enum tree_code code, tree type,
8537                                  tree arg0, tree arg1,
8538                                  bool *strict_overflow_p)
8539 {
8540   enum tree_code code0 = TREE_CODE (arg0);
8541   tree t, cst0 = NULL_TREE;
8542   int sgn0;
8543   bool swap = false;
8544
8545   /* Match A +- CST code arg1 and CST code arg1.  We can change the
8546      first form only if overflow is undefined.  */
8547   if (!(((ANY_INTEGRAL_TYPE_P (TREE_TYPE (arg0))
8548           && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0)))
8549          /* In principle pointers also have undefined overflow behavior,
8550             but that causes problems elsewhere.  */
8551          && !POINTER_TYPE_P (TREE_TYPE (arg0))
8552          && (code0 == MINUS_EXPR
8553              || code0 == PLUS_EXPR)
8554          && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
8555         || code0 == INTEGER_CST))
8556     return NULL_TREE;
8557
8558   /* Identify the constant in arg0 and its sign.  */
8559   if (code0 == INTEGER_CST)
8560     cst0 = arg0;
8561   else
8562     cst0 = TREE_OPERAND (arg0, 1);
8563   sgn0 = tree_int_cst_sgn (cst0);
8564
8565   /* Overflowed constants and zero will cause problems.  */
8566   if (integer_zerop (cst0)
8567       || TREE_OVERFLOW (cst0))
8568     return NULL_TREE;
8569
8570   /* See if we can reduce the magnitude of the constant in
8571      arg0 by changing the comparison code.  */
8572   if (code0 == INTEGER_CST)
8573     {
8574       /* CST <= arg1  ->  CST-1 < arg1.  */
8575       if (code == LE_EXPR && sgn0 == 1)
8576         code = LT_EXPR;
8577       /* -CST < arg1  ->  -CST-1 <= arg1.  */
8578       else if (code == LT_EXPR && sgn0 == -1)
8579         code = LE_EXPR;
8580       /* CST > arg1  ->  CST-1 >= arg1.  */
8581       else if (code == GT_EXPR && sgn0 == 1)
8582         code = GE_EXPR;
8583       /* -CST >= arg1  ->  -CST-1 > arg1.  */
8584       else if (code == GE_EXPR && sgn0 == -1)
8585         code = GT_EXPR;
8586       else
8587         return NULL_TREE;
8588       /* arg1 code' CST' might be more canonical.  */
8589       swap = true;
8590     }
8591   else
8592     {
8593       /* A - CST < arg1  ->  A - CST-1 <= arg1.  */
8594       if (code == LT_EXPR
8595           && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8596         code = LE_EXPR;
8597       /* A + CST > arg1  ->  A + CST-1 >= arg1.  */
8598       else if (code == GT_EXPR
8599                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8600         code = GE_EXPR;
8601       /* A + CST <= arg1  ->  A + CST-1 < arg1.  */
8602       else if (code == LE_EXPR
8603                && code0 == ((sgn0 == -1) ? MINUS_EXPR : PLUS_EXPR))
8604         code = LT_EXPR;
8605       /* A - CST >= arg1  ->  A - CST-1 > arg1.  */
8606       else if (code == GE_EXPR
8607                && code0 == ((sgn0 == -1) ? PLUS_EXPR : MINUS_EXPR))
8608         code = GT_EXPR;
8609       else
8610         return NULL_TREE;
8611       *strict_overflow_p = true;
8612     }
8613
8614   /* Now build the constant reduced in magnitude.  But not if that
8615      would produce one outside of its types range.  */
8616   if (INTEGRAL_TYPE_P (TREE_TYPE (cst0))
8617       && ((sgn0 == 1
8618            && TYPE_MIN_VALUE (TREE_TYPE (cst0))
8619            && tree_int_cst_equal (cst0, TYPE_MIN_VALUE (TREE_TYPE (cst0))))
8620           || (sgn0 == -1
8621               && TYPE_MAX_VALUE (TREE_TYPE (cst0))
8622               && tree_int_cst_equal (cst0, TYPE_MAX_VALUE (TREE_TYPE (cst0))))))
8623     /* We cannot swap the comparison here as that would cause us to
8624        endlessly recurse.  */
8625     return NULL_TREE;
8626
8627   t = int_const_binop (sgn0 == -1 ? PLUS_EXPR : MINUS_EXPR,
8628                        cst0, build_int_cst (TREE_TYPE (cst0), 1));
8629   if (code0 != INTEGER_CST)
8630     t = fold_build2_loc (loc, code0, TREE_TYPE (arg0), TREE_OPERAND (arg0, 0), t);
8631   t = fold_convert (TREE_TYPE (arg1), t);
8632
8633   /* If swapping might yield to a more canonical form, do so.  */
8634   if (swap)
8635     return fold_build2_loc (loc, swap_tree_comparison (code), type, arg1, t);
8636   else
8637     return fold_build2_loc (loc, code, type, t, arg1);
8638 }
8639
8640 /* Canonicalize the comparison ARG0 CODE ARG1 with type TYPE with undefined
8641    overflow further.  Try to decrease the magnitude of constants involved
8642    by changing LE_EXPR and GE_EXPR to LT_EXPR and GT_EXPR or vice versa
8643    and put sole constants at the second argument position.
8644    Returns the canonicalized tree if changed, otherwise NULL_TREE.  */
8645
8646 static tree
8647 maybe_canonicalize_comparison (location_t loc, enum tree_code code, tree type,
8648                                tree arg0, tree arg1)
8649 {
8650   tree t;
8651   bool strict_overflow_p;
8652   const char * const warnmsg = G_("assuming signed overflow does not occur "
8653                                   "when reducing constant in comparison");
8654
8655   /* Try canonicalization by simplifying arg0.  */
8656   strict_overflow_p = false;
8657   t = maybe_canonicalize_comparison_1 (loc, code, type, arg0, arg1,
8658                                        &strict_overflow_p);
8659   if (t)
8660     {
8661       if (strict_overflow_p)
8662         fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8663       return t;
8664     }
8665
8666   /* Try canonicalization by simplifying arg1 using the swapped
8667      comparison.  */
8668   code = swap_tree_comparison (code);
8669   strict_overflow_p = false;
8670   t = maybe_canonicalize_comparison_1 (loc, code, type, arg1, arg0,
8671                                        &strict_overflow_p);
8672   if (t && strict_overflow_p)
8673     fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
8674   return t;
8675 }
8676
8677 /* Return whether BASE + OFFSET + BITPOS may wrap around the address
8678    space.  This is used to avoid issuing overflow warnings for
8679    expressions like &p->x which can not wrap.  */
8680
8681 static bool
8682 pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos)
8683 {
8684   if (!POINTER_TYPE_P (TREE_TYPE (base)))
8685     return true;
8686
8687   if (bitpos < 0)
8688     return true;
8689
8690   wide_int wi_offset;
8691   int precision = TYPE_PRECISION (TREE_TYPE (base));
8692   if (offset == NULL_TREE)
8693     wi_offset = wi::zero (precision);
8694   else if (TREE_CODE (offset) != INTEGER_CST || TREE_OVERFLOW (offset))
8695     return true;
8696   else
8697     wi_offset = offset;
8698
8699   bool overflow;
8700   wide_int units = wi::shwi (bitpos / BITS_PER_UNIT, precision);
8701   wide_int total = wi::add (wi_offset, units, UNSIGNED, &overflow);
8702   if (overflow)
8703     return true;
8704
8705   if (!wi::fits_uhwi_p (total))
8706     return true;
8707
8708   HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (TREE_TYPE (base)));
8709   if (size <= 0)
8710     return true;
8711
8712   /* We can do slightly better for SIZE if we have an ADDR_EXPR of an
8713      array.  */
8714   if (TREE_CODE (base) == ADDR_EXPR)
8715     {
8716       HOST_WIDE_INT base_size;
8717
8718       base_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0)));
8719       if (base_size > 0 && size < base_size)
8720         size = base_size;
8721     }
8722
8723   return total.to_uhwi () > (unsigned HOST_WIDE_INT) size;
8724 }
8725
8726 /* Return the HOST_WIDE_INT least significant bits of T, a sizetype
8727    kind INTEGER_CST.  This makes sure to properly sign-extend the
8728    constant.  */
8729
8730 static HOST_WIDE_INT
8731 size_low_cst (const_tree t)
8732 {
8733   HOST_WIDE_INT w = TREE_INT_CST_ELT (t, 0);
8734   int prec = TYPE_PRECISION (TREE_TYPE (t));
8735   if (prec < HOST_BITS_PER_WIDE_INT)
8736     return sext_hwi (w, prec);
8737   return w;
8738 }
8739
8740 /* Subroutine of fold_binary.  This routine performs all of the
8741    transformations that are common to the equality/inequality
8742    operators (EQ_EXPR and NE_EXPR) and the ordering operators
8743    (LT_EXPR, LE_EXPR, GE_EXPR and GT_EXPR).  Callers other than
8744    fold_binary should call fold_binary.  Fold a comparison with
8745    tree code CODE and type TYPE with operands OP0 and OP1.  Return
8746    the folded comparison or NULL_TREE.  */
8747
8748 static tree
8749 fold_comparison (location_t loc, enum tree_code code, tree type,
8750                  tree op0, tree op1)
8751 {
8752   const bool equality_code = (code == EQ_EXPR || code == NE_EXPR);
8753   tree arg0, arg1, tem;
8754
8755   arg0 = op0;
8756   arg1 = op1;
8757
8758   STRIP_SIGN_NOPS (arg0);
8759   STRIP_SIGN_NOPS (arg1);
8760
8761   /* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 -+ C1.  */
8762   if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
8763       && (equality_code
8764           || (ANY_INTEGRAL_TYPE_P (TREE_TYPE (arg0))
8765               && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))))
8766       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
8767       && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
8768       && TREE_CODE (arg1) == INTEGER_CST
8769       && !TREE_OVERFLOW (arg1))
8770     {
8771       const enum tree_code
8772         reverse_op = TREE_CODE (arg0) == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR;
8773       tree const1 = TREE_OPERAND (arg0, 1);
8774       tree const2 = fold_convert_loc (loc, TREE_TYPE (const1), arg1);
8775       tree variable = TREE_OPERAND (arg0, 0);
8776       tree new_const = int_const_binop (reverse_op, const2, const1);
8777
8778       /* If the constant operation overflowed this can be
8779          simplified as a comparison against INT_MAX/INT_MIN.  */
8780       if (TREE_OVERFLOW (new_const)
8781           && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0)))
8782         {
8783           int const1_sgn = tree_int_cst_sgn (const1);
8784           enum tree_code code2 = code;
8785
8786           /* Get the sign of the constant on the lhs if the
8787              operation were VARIABLE + CONST1.  */
8788           if (TREE_CODE (arg0) == MINUS_EXPR)
8789             const1_sgn = -const1_sgn;
8790
8791           /* The sign of the constant determines if we overflowed
8792              INT_MAX (const1_sgn == -1) or INT_MIN (const1_sgn == 1).
8793              Canonicalize to the INT_MIN overflow by swapping the comparison
8794              if necessary.  */
8795           if (const1_sgn == -1)
8796             code2 = swap_tree_comparison (code);
8797
8798           /* We now can look at the canonicalized case
8799                VARIABLE + 1  CODE2  INT_MIN
8800              and decide on the result.  */
8801           switch (code2)
8802             {
8803             case EQ_EXPR:
8804             case LT_EXPR:
8805             case LE_EXPR:
8806               return
8807                 omit_one_operand_loc (loc, type, boolean_false_node, variable);
8808
8809             case NE_EXPR:
8810             case GE_EXPR:
8811             case GT_EXPR:
8812               return
8813                 omit_one_operand_loc (loc, type, boolean_true_node, variable);
8814
8815             default:
8816               gcc_unreachable ();
8817             }
8818         }
8819       else
8820         {
8821           if (!equality_code)
8822             fold_overflow_warning ("assuming signed overflow does not occur "
8823                                    "when changing X +- C1 cmp C2 to "
8824                                    "X cmp C2 -+ C1",
8825                                    WARN_STRICT_OVERFLOW_COMPARISON);
8826           return fold_build2_loc (loc, code, type, variable, new_const);
8827         }
8828     }
8829
8830   /* Transform comparisons of the form X - Y CMP 0 to X CMP Y.  */
8831   if (TREE_CODE (arg0) == MINUS_EXPR
8832       && equality_code
8833       && integer_zerop (arg1))
8834     {
8835       /* ??? The transformation is valid for the other operators if overflow
8836          is undefined for the type, but performing it here badly interacts
8837          with the transformation in fold_cond_expr_with_comparison which
8838          attempts to synthetize ABS_EXPR.  */
8839       if (!equality_code)
8840         fold_overflow_warning ("assuming signed overflow does not occur "
8841                                "when changing X - Y cmp 0 to X cmp Y",
8842                                WARN_STRICT_OVERFLOW_COMPARISON);
8843       return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
8844                               TREE_OPERAND (arg0, 1));
8845     }
8846
8847   /* For comparisons of pointers we can decompose it to a compile time
8848      comparison of the base objects and the offsets into the object.
8849      This requires at least one operand being an ADDR_EXPR or a
8850      POINTER_PLUS_EXPR to do more than the operand_equal_p test below.  */
8851   if (POINTER_TYPE_P (TREE_TYPE (arg0))
8852       && (TREE_CODE (arg0) == ADDR_EXPR
8853           || TREE_CODE (arg1) == ADDR_EXPR
8854           || TREE_CODE (arg0) == POINTER_PLUS_EXPR
8855           || TREE_CODE (arg1) == POINTER_PLUS_EXPR))
8856     {
8857       tree base0, base1, offset0 = NULL_TREE, offset1 = NULL_TREE;
8858       HOST_WIDE_INT bitsize, bitpos0 = 0, bitpos1 = 0;
8859       machine_mode mode;
8860       int volatilep, unsignedp;
8861       bool indirect_base0 = false, indirect_base1 = false;
8862
8863       /* Get base and offset for the access.  Strip ADDR_EXPR for
8864          get_inner_reference, but put it back by stripping INDIRECT_REF
8865          off the base object if possible.  indirect_baseN will be true
8866          if baseN is not an address but refers to the object itself.  */
8867       base0 = arg0;
8868       if (TREE_CODE (arg0) == ADDR_EXPR)
8869         {
8870           base0 = get_inner_reference (TREE_OPERAND (arg0, 0),
8871                                        &bitsize, &bitpos0, &offset0, &mode,
8872                                        &unsignedp, &volatilep, false);
8873           if (TREE_CODE (base0) == INDIRECT_REF)
8874             base0 = TREE_OPERAND (base0, 0);
8875           else
8876             indirect_base0 = true;
8877         }
8878       else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
8879         {
8880           base0 = TREE_OPERAND (arg0, 0);
8881           STRIP_SIGN_NOPS (base0);
8882           if (TREE_CODE (base0) == ADDR_EXPR)
8883             {
8884               base0 = TREE_OPERAND (base0, 0);
8885               indirect_base0 = true;
8886             }
8887           offset0 = TREE_OPERAND (arg0, 1);
8888           if (tree_fits_shwi_p (offset0))
8889             {
8890               HOST_WIDE_INT off = size_low_cst (offset0);
8891               if ((HOST_WIDE_INT) (((unsigned HOST_WIDE_INT) off)
8892                                    * BITS_PER_UNIT)
8893                   / BITS_PER_UNIT == (HOST_WIDE_INT) off)
8894                 {
8895                   bitpos0 = off * BITS_PER_UNIT;
8896                   offset0 = NULL_TREE;
8897                 }
8898             }
8899         }
8900
8901       base1 = arg1;
8902       if (TREE_CODE (arg1) == ADDR_EXPR)
8903         {
8904           base1 = get_inner_reference (TREE_OPERAND (arg1, 0),
8905                                        &bitsize, &bitpos1, &offset1, &mode,
8906                                        &unsignedp, &volatilep, false);
8907           if (TREE_CODE (base1) == INDIRECT_REF)
8908             base1 = TREE_OPERAND (base1, 0);
8909           else
8910             indirect_base1 = true;
8911         }
8912       else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
8913         {
8914           base1 = TREE_OPERAND (arg1, 0);
8915           STRIP_SIGN_NOPS (base1);
8916           if (TREE_CODE (base1) == ADDR_EXPR)
8917             {
8918               base1 = TREE_OPERAND (base1, 0);
8919               indirect_base1 = true;
8920             }
8921           offset1 = TREE_OPERAND (arg1, 1);
8922           if (tree_fits_shwi_p (offset1))
8923             {
8924               HOST_WIDE_INT off = size_low_cst (offset1);
8925               if ((HOST_WIDE_INT) (((unsigned HOST_WIDE_INT) off)
8926                                    * BITS_PER_UNIT)
8927                   / BITS_PER_UNIT == (HOST_WIDE_INT) off)
8928                 {
8929                   bitpos1 = off * BITS_PER_UNIT;
8930                   offset1 = NULL_TREE;
8931                 }
8932             }
8933         }
8934
8935       /* A local variable can never be pointed to by
8936          the default SSA name of an incoming parameter.  */
8937       if ((TREE_CODE (arg0) == ADDR_EXPR
8938            && indirect_base0
8939            && TREE_CODE (base0) == VAR_DECL
8940            && auto_var_in_fn_p (base0, current_function_decl)
8941            && !indirect_base1
8942            && TREE_CODE (base1) == SSA_NAME
8943            && SSA_NAME_IS_DEFAULT_DEF (base1)
8944            && TREE_CODE (SSA_NAME_VAR (base1)) == PARM_DECL)
8945           || (TREE_CODE (arg1) == ADDR_EXPR
8946               && indirect_base1
8947               && TREE_CODE (base1) == VAR_DECL
8948               && auto_var_in_fn_p (base1, current_function_decl)
8949               && !indirect_base0
8950               && TREE_CODE (base0) == SSA_NAME
8951               && SSA_NAME_IS_DEFAULT_DEF (base0)
8952               && TREE_CODE (SSA_NAME_VAR (base0)) == PARM_DECL))
8953         {
8954           if (code == NE_EXPR)
8955             return constant_boolean_node (1, type);
8956           else if (code == EQ_EXPR)
8957             return constant_boolean_node (0, type);
8958         }
8959       /* If we have equivalent bases we might be able to simplify.  */
8960       else if (indirect_base0 == indirect_base1
8961                && operand_equal_p (base0, base1, 0))
8962         {
8963           /* We can fold this expression to a constant if the non-constant
8964              offset parts are equal.  */
8965           if ((offset0 == offset1
8966                || (offset0 && offset1
8967                    && operand_equal_p (offset0, offset1, 0)))
8968               && (code == EQ_EXPR
8969                   || code == NE_EXPR
8970                   || (indirect_base0 && DECL_P (base0))
8971                   || POINTER_TYPE_OVERFLOW_UNDEFINED))
8972
8973             {
8974               if (!equality_code
8975                   && bitpos0 != bitpos1
8976                   && (pointer_may_wrap_p (base0, offset0, bitpos0)
8977                       || pointer_may_wrap_p (base1, offset1, bitpos1)))
8978                 fold_overflow_warning (("assuming pointer wraparound does not "
8979                                         "occur when comparing P +- C1 with "
8980                                         "P +- C2"),
8981                                        WARN_STRICT_OVERFLOW_CONDITIONAL);
8982
8983               switch (code)
8984                 {
8985                 case EQ_EXPR:
8986                   return constant_boolean_node (bitpos0 == bitpos1, type);
8987                 case NE_EXPR:
8988                   return constant_boolean_node (bitpos0 != bitpos1, type);
8989                 case LT_EXPR:
8990                   return constant_boolean_node (bitpos0 < bitpos1, type);
8991                 case LE_EXPR:
8992                   return constant_boolean_node (bitpos0 <= bitpos1, type);
8993                 case GE_EXPR:
8994                   return constant_boolean_node (bitpos0 >= bitpos1, type);
8995                 case GT_EXPR:
8996                   return constant_boolean_node (bitpos0 > bitpos1, type);
8997                 default:;
8998                 }
8999             }
9000           /* We can simplify the comparison to a comparison of the variable
9001              offset parts if the constant offset parts are equal.
9002              Be careful to use signed sizetype here because otherwise we
9003              mess with array offsets in the wrong way.  This is possible
9004              because pointer arithmetic is restricted to retain within an
9005              object and overflow on pointer differences is undefined as of
9006              6.5.6/8 and /9 with respect to the signed ptrdiff_t.  */
9007           else if (bitpos0 == bitpos1
9008                    && (equality_code
9009                        || (indirect_base0 && DECL_P (base0))
9010                        || POINTER_TYPE_OVERFLOW_UNDEFINED))
9011             {
9012               /* By converting to signed sizetype we cover middle-end pointer
9013                  arithmetic which operates on unsigned pointer types of size
9014                  type size and ARRAY_REF offsets which are properly sign or
9015                  zero extended from their type in case it is narrower than
9016                  sizetype.  */
9017               if (offset0 == NULL_TREE)
9018                 offset0 = build_int_cst (ssizetype, 0);
9019               else
9020                 offset0 = fold_convert_loc (loc, ssizetype, offset0);
9021               if (offset1 == NULL_TREE)
9022                 offset1 = build_int_cst (ssizetype, 0);
9023               else
9024                 offset1 = fold_convert_loc (loc, ssizetype, offset1);
9025
9026               if (!equality_code
9027                   && (pointer_may_wrap_p (base0, offset0, bitpos0)
9028                       || pointer_may_wrap_p (base1, offset1, bitpos1)))
9029                 fold_overflow_warning (("assuming pointer wraparound does not "
9030                                         "occur when comparing P +- C1 with "
9031                                         "P +- C2"),
9032                                        WARN_STRICT_OVERFLOW_COMPARISON);
9033
9034               return fold_build2_loc (loc, code, type, offset0, offset1);
9035             }
9036         }
9037       /* For non-equal bases we can simplify if they are addresses
9038          declarations with different addresses.  */
9039       else if (indirect_base0 && indirect_base1
9040                /* We know that !operand_equal_p (base0, base1, 0)
9041                   because the if condition was false.  But make
9042                   sure two decls are not the same.  */
9043                && base0 != base1
9044                && TREE_CODE (arg0) == ADDR_EXPR
9045                && TREE_CODE (arg1) == ADDR_EXPR
9046                && DECL_P (base0)
9047                && DECL_P (base1)
9048                /* Watch for aliases.  */
9049                && (!decl_in_symtab_p (base0)
9050                    || !decl_in_symtab_p (base1)
9051                    || !symtab_node::get_create (base0)->equal_address_to
9052                          (symtab_node::get_create (base1))))
9053         {
9054           if (code == EQ_EXPR)
9055             return omit_two_operands_loc (loc, type, boolean_false_node,
9056                                       arg0, arg1);
9057           else if (code == NE_EXPR)
9058             return omit_two_operands_loc (loc, type, boolean_true_node,
9059                                       arg0, arg1);
9060         }
9061       /* For equal offsets we can simplify to a comparison of the
9062          base addresses.  */
9063       else if (bitpos0 == bitpos1
9064                && (indirect_base0
9065                    ? base0 != TREE_OPERAND (arg0, 0) : base0 != arg0)
9066                && (indirect_base1
9067                    ? base1 != TREE_OPERAND (arg1, 0) : base1 != arg1)
9068                && ((offset0 == offset1)
9069                    || (offset0 && offset1
9070                        && operand_equal_p (offset0, offset1, 0))))
9071         {
9072           if (indirect_base0)
9073             base0 = build_fold_addr_expr_loc (loc, base0);
9074           if (indirect_base1)
9075             base1 = build_fold_addr_expr_loc (loc, base1);
9076           return fold_build2_loc (loc, code, type, base0, base1);
9077         }
9078     }
9079
9080   /* Transform comparisons of the form X +- C1 CMP Y +- C2 to
9081      X CMP Y +- C2 +- C1 for signed X, Y.  This is valid if
9082      the resulting offset is smaller in absolute value than the
9083      original one and has the same sign.  */
9084   if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (arg0))
9085       && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9086       && (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
9087       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9088           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
9089       && (TREE_CODE (arg1) == PLUS_EXPR || TREE_CODE (arg1) == MINUS_EXPR)
9090       && (TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
9091           && !TREE_OVERFLOW (TREE_OPERAND (arg1, 1))))
9092     {
9093       tree const1 = TREE_OPERAND (arg0, 1);
9094       tree const2 = TREE_OPERAND (arg1, 1);
9095       tree variable1 = TREE_OPERAND (arg0, 0);
9096       tree variable2 = TREE_OPERAND (arg1, 0);
9097       tree cst;
9098       const char * const warnmsg = G_("assuming signed overflow does not "
9099                                       "occur when combining constants around "
9100                                       "a comparison");
9101
9102       /* Put the constant on the side where it doesn't overflow and is
9103          of lower absolute value and of same sign than before.  */
9104       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
9105                              ? MINUS_EXPR : PLUS_EXPR,
9106                              const2, const1);
9107       if (!TREE_OVERFLOW (cst)
9108           && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2)
9109           && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const2))
9110         {
9111           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
9112           return fold_build2_loc (loc, code, type,
9113                                   variable1,
9114                                   fold_build2_loc (loc, TREE_CODE (arg1),
9115                                                    TREE_TYPE (arg1),
9116                                                    variable2, cst));
9117         }
9118
9119       cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
9120                              ? MINUS_EXPR : PLUS_EXPR,
9121                              const1, const2);
9122       if (!TREE_OVERFLOW (cst)
9123           && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1)
9124           && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const1))
9125         {
9126           fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
9127           return fold_build2_loc (loc, code, type,
9128                                   fold_build2_loc (loc, TREE_CODE (arg0),
9129                                                    TREE_TYPE (arg0),
9130                                                    variable1, cst),
9131                                   variable2);
9132         }
9133     }
9134
9135   /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
9136      signed arithmetic case.  That form is created by the compiler
9137      often enough for folding it to be of value.  One example is in
9138      computing loop trip counts after Operator Strength Reduction.  */
9139   if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (arg0))
9140       && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
9141       && TREE_CODE (arg0) == MULT_EXPR
9142       && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9143           && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
9144       && integer_zerop (arg1))
9145     {
9146       tree const1 = TREE_OPERAND (arg0, 1);
9147       tree const2 = arg1;                       /* zero */
9148       tree variable1 = TREE_OPERAND (arg0, 0);
9149       enum tree_code cmp_code = code;
9150
9151       /* Handle unfolded multiplication by zero.  */
9152       if (integer_zerop (const1))
9153         return fold_build2_loc (loc, cmp_code, type, const1, const2);
9154
9155       fold_overflow_warning (("assuming signed overflow does not occur when "
9156                               "eliminating multiplication in comparison "
9157                               "with zero"),
9158                              WARN_STRICT_OVERFLOW_COMPARISON);
9159
9160       /* If const1 is negative we swap the sense of the comparison.  */
9161       if (tree_int_cst_sgn (const1) < 0)
9162         cmp_code = swap_tree_comparison (cmp_code);
9163
9164       return fold_build2_loc (loc, cmp_code, type, variable1, const2);
9165     }
9166
9167   tem = maybe_canonicalize_comparison (loc, code, type, arg0, arg1);
9168   if (tem)
9169     return tem;
9170
9171   if (FLOAT_TYPE_P (TREE_TYPE (arg0)))
9172     {
9173       tree targ0 = strip_float_extensions (arg0);
9174       tree targ1 = strip_float_extensions (arg1);
9175       tree newtype = TREE_TYPE (targ0);
9176
9177       if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
9178         newtype = TREE_TYPE (targ1);
9179
9180       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
9181       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
9182         return fold_build2_loc (loc, code, type,
9183                             fold_convert_loc (loc, newtype, targ0),
9184                             fold_convert_loc (loc, newtype, targ1));
9185
9186       if (TREE_CODE (arg1) == REAL_CST)
9187         {
9188           REAL_VALUE_TYPE cst;
9189           cst = TREE_REAL_CST (arg1);
9190
9191           /* IEEE doesn't distinguish +0 and -0 in comparisons.  */
9192           /* a CMP (-0) -> a CMP 0  */
9193           if (REAL_VALUE_MINUS_ZERO (cst))
9194             return fold_build2_loc (loc, code, type, arg0,
9195                                 build_real (TREE_TYPE (arg1), dconst0));
9196
9197           /* x != NaN is always true, other ops are always false.  */
9198           if (REAL_VALUE_ISNAN (cst)
9199               && ! HONOR_SNANS (arg1))
9200             {
9201               tem = (code == NE_EXPR) ? integer_one_node : integer_zero_node;
9202               return omit_one_operand_loc (loc, type, tem, arg0);
9203             }
9204
9205           /* Fold comparisons against infinity.  */
9206           if (REAL_VALUE_ISINF (cst)
9207               && MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1))))
9208             {
9209               tem = fold_inf_compare (loc, code, type, arg0, arg1);
9210               if (tem != NULL_TREE)
9211                 return tem;
9212             }
9213         }
9214
9215       /* If this is a comparison of a real constant with a PLUS_EXPR
9216          or a MINUS_EXPR of a real constant, we can convert it into a
9217          comparison with a revised real constant as long as no overflow
9218          occurs when unsafe_math_optimizations are enabled.  */
9219       if (flag_unsafe_math_optimizations
9220           && TREE_CODE (arg1) == REAL_CST
9221           && (TREE_CODE (arg0) == PLUS_EXPR
9222               || TREE_CODE (arg0) == MINUS_EXPR)
9223           && TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
9224           && 0 != (tem = const_binop (TREE_CODE (arg0) == PLUS_EXPR
9225                                       ? MINUS_EXPR : PLUS_EXPR,
9226                                       arg1, TREE_OPERAND (arg0, 1)))
9227           && !TREE_OVERFLOW (tem))
9228         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
9229
9230       /* Likewise, we can simplify a comparison of a real constant with
9231          a MINUS_EXPR whose first operand is also a real constant, i.e.
9232          (c1 - x) < c2 becomes x > c1-c2.  Reordering is allowed on
9233          floating-point types only if -fassociative-math is set.  */
9234       if (flag_associative_math
9235           && TREE_CODE (arg1) == REAL_CST
9236           && TREE_CODE (arg0) == MINUS_EXPR
9237           && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST
9238           && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0),
9239                                       arg1))
9240           && !TREE_OVERFLOW (tem))
9241         return fold_build2_loc (loc, swap_tree_comparison (code), type,
9242                             TREE_OPERAND (arg0, 1), tem);
9243
9244       /* Fold comparisons against built-in math functions.  */
9245       if (TREE_CODE (arg1) == REAL_CST
9246           && flag_unsafe_math_optimizations
9247           && ! flag_errno_math)
9248         {
9249           enum built_in_function fcode = builtin_mathfn_code (arg0);
9250
9251           if (fcode != END_BUILTINS)
9252             {
9253               tem = fold_mathfn_compare (loc, fcode, code, type, arg0, arg1);
9254               if (tem != NULL_TREE)
9255                 return tem;
9256             }
9257         }
9258     }
9259
9260   if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE
9261       && CONVERT_EXPR_P (arg0))
9262     {
9263       /* If we are widening one operand of an integer comparison,
9264          see if the other operand is similarly being widened.  Perhaps we
9265          can do the comparison in the narrower type.  */
9266       tem = fold_widened_comparison (loc, code, type, arg0, arg1);
9267       if (tem)
9268         return tem;
9269
9270       /* Or if we are changing signedness.  */
9271       tem = fold_sign_changed_comparison (loc, code, type, arg0, arg1);
9272       if (tem)
9273         return tem;
9274     }
9275
9276   /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a
9277      constant, we can simplify it.  */
9278   if (TREE_CODE (arg1) == INTEGER_CST
9279       && (TREE_CODE (arg0) == MIN_EXPR
9280           || TREE_CODE (arg0) == MAX_EXPR)
9281       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
9282     {
9283       tem = optimize_minmax_comparison (loc, code, type, op0, op1);
9284       if (tem)
9285         return tem;
9286     }
9287
9288   /* Simplify comparison of something with itself.  (For IEEE
9289      floating-point, we can only do some of these simplifications.)  */
9290   if (operand_equal_p (arg0, arg1, 0))
9291     {
9292       switch (code)
9293         {
9294         case EQ_EXPR:
9295           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9296               || ! HONOR_NANS (arg0))
9297             return constant_boolean_node (1, type);
9298           break;
9299
9300         case GE_EXPR:
9301         case LE_EXPR:
9302           if (! FLOAT_TYPE_P (TREE_TYPE (arg0))
9303               || ! HONOR_NANS (arg0))
9304             return constant_boolean_node (1, type);
9305           return fold_build2_loc (loc, EQ_EXPR, type, arg0, arg1);
9306
9307         case NE_EXPR:
9308           /* For NE, we can only do this simplification if integer
9309              or we don't honor IEEE floating point NaNs.  */
9310           if (FLOAT_TYPE_P (TREE_TYPE (arg0))
9311               && HONOR_NANS (arg0))
9312             break;
9313           /* ... fall through ...  */
9314         case GT_EXPR:
9315         case LT_EXPR:
9316           return constant_boolean_node (0, type);
9317         default:
9318           gcc_unreachable ();
9319         }
9320     }
9321
9322   /* If we are comparing an expression that just has comparisons
9323      of two integer values, arithmetic expressions of those comparisons,
9324      and constants, we can simplify it.  There are only three cases
9325      to check: the two values can either be equal, the first can be
9326      greater, or the second can be greater.  Fold the expression for
9327      those three values.  Since each value must be 0 or 1, we have
9328      eight possibilities, each of which corresponds to the constant 0
9329      or 1 or one of the six possible comparisons.
9330
9331      This handles common cases like (a > b) == 0 but also handles
9332      expressions like  ((x > y) - (y > x)) > 0, which supposedly
9333      occur in macroized code.  */
9334
9335   if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) != INTEGER_CST)
9336     {
9337       tree cval1 = 0, cval2 = 0;
9338       int save_p = 0;
9339
9340       if (twoval_comparison_p (arg0, &cval1, &cval2, &save_p)
9341           /* Don't handle degenerate cases here; they should already
9342              have been handled anyway.  */
9343           && cval1 != 0 && cval2 != 0
9344           && ! (TREE_CONSTANT (cval1) && TREE_CONSTANT (cval2))
9345           && TREE_TYPE (cval1) == TREE_TYPE (cval2)
9346           && INTEGRAL_TYPE_P (TREE_TYPE (cval1))
9347           && TYPE_MAX_VALUE (TREE_TYPE (cval1))
9348           && TYPE_MAX_VALUE (TREE_TYPE (cval2))
9349           && ! operand_equal_p (TYPE_MIN_VALUE (TREE_TYPE (cval1)),
9350                                 TYPE_MAX_VALUE (TREE_TYPE (cval2)), 0))
9351         {
9352           tree maxval = TYPE_MAX_VALUE (TREE_TYPE (cval1));
9353           tree minval = TYPE_MIN_VALUE (TREE_TYPE (cval1));
9354
9355           /* We can't just pass T to eval_subst in case cval1 or cval2
9356              was the same as ARG1.  */
9357
9358           tree high_result
9359                 = fold_build2_loc (loc, code, type,
9360                                eval_subst (loc, arg0, cval1, maxval,
9361                                            cval2, minval),
9362                                arg1);
9363           tree equal_result
9364                 = fold_build2_loc (loc, code, type,
9365                                eval_subst (loc, arg0, cval1, maxval,
9366                                            cval2, maxval),
9367                                arg1);
9368           tree low_result
9369                 = fold_build2_loc (loc, code, type,
9370                                eval_subst (loc, arg0, cval1, minval,
9371                                            cval2, maxval),
9372                                arg1);
9373
9374           /* All three of these results should be 0 or 1.  Confirm they are.
9375              Then use those values to select the proper code to use.  */
9376
9377           if (TREE_CODE (high_result) == INTEGER_CST
9378               && TREE_CODE (equal_result) == INTEGER_CST
9379               && TREE_CODE (low_result) == INTEGER_CST)
9380             {
9381               /* Make a 3-bit mask with the high-order bit being the
9382                  value for `>', the next for '=', and the low for '<'.  */
9383               switch ((integer_onep (high_result) * 4)
9384                       + (integer_onep (equal_result) * 2)
9385                       + integer_onep (low_result))
9386                 {
9387                 case 0:
9388                   /* Always false.  */
9389                   return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
9390                 case 1:
9391                   code = LT_EXPR;
9392                   break;
9393                 case 2:
9394                   code = EQ_EXPR;
9395                   break;
9396                 case 3:
9397                   code = LE_EXPR;
9398                   break;
9399                 case 4:
9400                   code = GT_EXPR;
9401                   break;
9402                 case 5:
9403                   code = NE_EXPR;
9404                   break;
9405                 case 6:
9406                   code = GE_EXPR;
9407                   break;
9408                 case 7:
9409                   /* Always true.  */
9410                   return omit_one_operand_loc (loc, type, integer_one_node, arg0);
9411                 }
9412
9413               if (save_p)
9414                 {
9415                   tem = save_expr (build2 (code, type, cval1, cval2));
9416                   SET_EXPR_LOCATION (tem, loc);
9417                   return tem;
9418                 }
9419               return fold_build2_loc (loc, code, type, cval1, cval2);
9420             }
9421         }
9422     }
9423
9424   /* We can fold X/C1 op C2 where C1 and C2 are integer constants
9425      into a single range test.  */
9426   if ((TREE_CODE (arg0) == TRUNC_DIV_EXPR
9427        || TREE_CODE (arg0) == EXACT_DIV_EXPR)
9428       && TREE_CODE (arg1) == INTEGER_CST
9429       && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
9430       && !integer_zerop (TREE_OPERAND (arg0, 1))
9431       && !TREE_OVERFLOW (TREE_OPERAND (arg0, 1))
9432       && !TREE_OVERFLOW (arg1))
9433     {
9434       tem = fold_div_compare (loc, code, type, arg0, arg1);
9435       if (tem != NULL_TREE)
9436         return tem;
9437     }
9438
9439   /* Fold ~X op ~Y as Y op X.  */
9440   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9441       && TREE_CODE (arg1) == BIT_NOT_EXPR)
9442     {
9443       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9444       return fold_build2_loc (loc, code, type,
9445                           fold_convert_loc (loc, cmp_type,
9446                                             TREE_OPERAND (arg1, 0)),
9447                           TREE_OPERAND (arg0, 0));
9448     }
9449
9450   /* Fold ~X op C as X op' ~C, where op' is the swapped comparison.  */
9451   if (TREE_CODE (arg0) == BIT_NOT_EXPR
9452       && (TREE_CODE (arg1) == INTEGER_CST || TREE_CODE (arg1) == VECTOR_CST))
9453     {
9454       tree cmp_type = TREE_TYPE (TREE_OPERAND (arg0, 0));
9455       return fold_build2_loc (loc, swap_tree_comparison (code), type,
9456                           TREE_OPERAND (arg0, 0),
9457                           fold_build1_loc (loc, BIT_NOT_EXPR, cmp_type,
9458                                        fold_convert_loc (loc, cmp_type, arg1)));
9459     }
9460
9461   return NULL_TREE;
9462 }
9463
9464
9465 /* Subroutine of fold_binary.  Optimize complex multiplications of the
9466    form z * conj(z), as pow(realpart(z),2) + pow(imagpart(z),2).  The
9467    argument EXPR represents the expression "z" of type TYPE.  */
9468
9469 static tree
9470 fold_mult_zconjz (location_t loc, tree type, tree expr)
9471 {
9472   tree itype = TREE_TYPE (type);
9473   tree rpart, ipart, tem;
9474
9475   if (TREE_CODE (expr) == COMPLEX_EXPR)
9476     {
9477       rpart = TREE_OPERAND (expr, 0);
9478       ipart = TREE_OPERAND (expr, 1);
9479     }
9480   else if (TREE_CODE (expr) == COMPLEX_CST)
9481     {
9482       rpart = TREE_REALPART (expr);
9483       ipart = TREE_IMAGPART (expr);
9484     }
9485   else
9486     {
9487       expr = save_expr (expr);
9488       rpart = fold_build1_loc (loc, REALPART_EXPR, itype, expr);
9489       ipart = fold_build1_loc (loc, IMAGPART_EXPR, itype, expr);
9490     }
9491
9492   rpart = save_expr (rpart);
9493   ipart = save_expr (ipart);
9494   tem = fold_build2_loc (loc, PLUS_EXPR, itype,
9495                      fold_build2_loc (loc, MULT_EXPR, itype, rpart, rpart),
9496                      fold_build2_loc (loc, MULT_EXPR, itype, ipart, ipart));
9497   return fold_build2_loc (loc, COMPLEX_EXPR, type, tem,
9498                           build_zero_cst (itype));
9499 }
9500
9501
9502 /* Subroutine of fold_binary.  If P is the value of EXPR, computes
9503    power-of-two M and (arbitrary) N such that M divides (P-N).  This condition
9504    guarantees that P and N have the same least significant log2(M) bits.
9505    N is not otherwise constrained.  In particular, N is not normalized to
9506    0 <= N < M as is common.  In general, the precise value of P is unknown.
9507    M is chosen as large as possible such that constant N can be determined.
9508
9509    Returns M and sets *RESIDUE to N.
9510
9511    If ALLOW_FUNC_ALIGN is true, do take functions' DECL_ALIGN_UNIT into
9512    account.  This is not always possible due to PR 35705.
9513  */
9514
9515 static unsigned HOST_WIDE_INT
9516 get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue,
9517                                  bool allow_func_align)
9518 {
9519   enum tree_code code;
9520
9521   *residue = 0;
9522
9523   code = TREE_CODE (expr);
9524   if (code == ADDR_EXPR)
9525     {
9526       unsigned int bitalign;
9527       get_object_alignment_1 (TREE_OPERAND (expr, 0), &bitalign, residue);
9528       *residue /= BITS_PER_UNIT;
9529       return bitalign / BITS_PER_UNIT;
9530     }
9531   else if (code == POINTER_PLUS_EXPR)
9532     {
9533       tree op0, op1;
9534       unsigned HOST_WIDE_INT modulus;
9535       enum tree_code inner_code;
9536
9537       op0 = TREE_OPERAND (expr, 0);
9538       STRIP_NOPS (op0);
9539       modulus = get_pointer_modulus_and_residue (op0, residue,
9540                                                  allow_func_align);
9541
9542       op1 = TREE_OPERAND (expr, 1);
9543       STRIP_NOPS (op1);
9544       inner_code = TREE_CODE (op1);
9545       if (inner_code == INTEGER_CST)
9546         {
9547           *residue += TREE_INT_CST_LOW (op1);
9548           return modulus;
9549         }
9550       else if (inner_code == MULT_EXPR)
9551         {
9552           op1 = TREE_OPERAND (op1, 1);
9553           if (TREE_CODE (op1) == INTEGER_CST)
9554             {
9555               unsigned HOST_WIDE_INT align;
9556
9557               /* Compute the greatest power-of-2 divisor of op1.  */
9558               align = TREE_INT_CST_LOW (op1);
9559               align &= -align;
9560
9561               /* If align is non-zero and less than *modulus, replace
9562                  *modulus with align., If align is 0, then either op1 is 0
9563                  or the greatest power-of-2 divisor of op1 doesn't fit in an
9564                  unsigned HOST_WIDE_INT.  In either case, no additional
9565                  constraint is imposed.  */
9566               if (align)
9567                 modulus = MIN (modulus, align);
9568
9569               return modulus;
9570             }
9571         }
9572     }
9573
9574   /* If we get here, we were unable to determine anything useful about the
9575      expression.  */
9576   return 1;
9577 }
9578
9579 /* Helper function for fold_vec_perm.  Store elements of VECTOR_CST or
9580    CONSTRUCTOR ARG into array ELTS and return true if successful.  */
9581
9582 static bool
9583 vec_cst_ctor_to_array (tree arg, tree *elts)
9584 {
9585   unsigned int nelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg)), i;
9586
9587   if (TREE_CODE (arg) == VECTOR_CST)
9588     {
9589       for (i = 0; i < VECTOR_CST_NELTS (arg); ++i)
9590         elts[i] = VECTOR_CST_ELT (arg, i);
9591     }
9592   else if (TREE_CODE (arg) == CONSTRUCTOR)
9593     {
9594       constructor_elt *elt;
9595
9596       FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (arg), i, elt)
9597         if (i >= nelts || TREE_CODE (TREE_TYPE (elt->value)) == VECTOR_TYPE)
9598           return false;
9599         else
9600           elts[i] = elt->value;
9601     }
9602   else
9603     return false;
9604   for (; i < nelts; i++)
9605     elts[i]
9606       = fold_convert (TREE_TYPE (TREE_TYPE (arg)), integer_zero_node);
9607   return true;
9608 }
9609
9610 /* Attempt to fold vector permutation of ARG0 and ARG1 vectors using SEL
9611    selector.  Return the folded VECTOR_CST or CONSTRUCTOR if successful,
9612    NULL_TREE otherwise.  */
9613
9614 static tree
9615 fold_vec_perm (tree type, tree arg0, tree arg1, const unsigned char *sel)
9616 {
9617   unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
9618   tree *elts;
9619   bool need_ctor = false;
9620
9621   gcc_assert (TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)) == nelts
9622               && TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg1)) == nelts);
9623   if (TREE_TYPE (TREE_TYPE (arg0)) != TREE_TYPE (type)
9624       || TREE_TYPE (TREE_TYPE (arg1)) != TREE_TYPE (type))
9625     return NULL_TREE;
9626
9627   elts = XALLOCAVEC (tree, nelts * 3);
9628   if (!vec_cst_ctor_to_array (arg0, elts)
9629       || !vec_cst_ctor_to_array (arg1, elts + nelts))
9630     return NULL_TREE;
9631
9632   for (i = 0; i < nelts; i++)
9633     {
9634       if (!CONSTANT_CLASS_P (elts[sel[i]]))
9635         need_ctor = true;
9636       elts[i + 2 * nelts] = unshare_expr (elts[sel[i]]);
9637     }
9638
9639   if (need_ctor)
9640     {
9641       vec<constructor_elt, va_gc> *v;
9642       vec_alloc (v, nelts);
9643       for (i = 0; i < nelts; i++)
9644         CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, elts[2 * nelts + i]);
9645       return build_constructor (type, v);
9646     }
9647   else
9648     return build_vector (type, &elts[2 * nelts]);
9649 }
9650
9651 /* Try to fold a pointer difference of type TYPE two address expressions of
9652    array references AREF0 and AREF1 using location LOC.  Return a
9653    simplified expression for the difference or NULL_TREE.  */
9654
9655 static tree
9656 fold_addr_of_array_ref_difference (location_t loc, tree type,
9657                                    tree aref0, tree aref1)
9658 {
9659   tree base0 = TREE_OPERAND (aref0, 0);
9660   tree base1 = TREE_OPERAND (aref1, 0);
9661   tree base_offset = build_int_cst (type, 0);
9662
9663   /* If the bases are array references as well, recurse.  If the bases
9664      are pointer indirections compute the difference of the pointers.
9665      If the bases are equal, we are set.  */
9666   if ((TREE_CODE (base0) == ARRAY_REF
9667        && TREE_CODE (base1) == ARRAY_REF
9668        && (base_offset
9669            = fold_addr_of_array_ref_difference (loc, type, base0, base1)))
9670       || (INDIRECT_REF_P (base0)
9671           && INDIRECT_REF_P (base1)
9672           && (base_offset = fold_binary_loc (loc, MINUS_EXPR, type,
9673                                              TREE_OPERAND (base0, 0),
9674                                              TREE_OPERAND (base1, 0))))
9675       || operand_equal_p (base0, base1, 0))
9676     {
9677       tree op0 = fold_convert_loc (loc, type, TREE_OPERAND (aref0, 1));
9678       tree op1 = fold_convert_loc (loc, type, TREE_OPERAND (aref1, 1));
9679       tree esz = fold_convert_loc (loc, type, array_ref_element_size (aref0));
9680       tree diff = build2 (MINUS_EXPR, type, op0, op1);
9681       return fold_build2_loc (loc, PLUS_EXPR, type,
9682                               base_offset,
9683                               fold_build2_loc (loc, MULT_EXPR, type,
9684                                                diff, esz));
9685     }
9686   return NULL_TREE;
9687 }
9688
9689 /* If the real or vector real constant CST of type TYPE has an exact
9690    inverse, return it, else return NULL.  */
9691
9692 tree
9693 exact_inverse (tree type, tree cst)
9694 {
9695   REAL_VALUE_TYPE r;
9696   tree unit_type, *elts;
9697   machine_mode mode;
9698   unsigned vec_nelts, i;
9699
9700   switch (TREE_CODE (cst))
9701     {
9702     case REAL_CST:
9703       r = TREE_REAL_CST (cst);
9704
9705       if (exact_real_inverse (TYPE_MODE (type), &r))
9706         return build_real (type, r);
9707
9708       return NULL_TREE;
9709
9710     case VECTOR_CST:
9711       vec_nelts = VECTOR_CST_NELTS (cst);
9712       elts = XALLOCAVEC (tree, vec_nelts);
9713       unit_type = TREE_TYPE (type);
9714       mode = TYPE_MODE (unit_type);
9715
9716       for (i = 0; i < vec_nelts; i++)
9717         {
9718           r = TREE_REAL_CST (VECTOR_CST_ELT (cst, i));
9719           if (!exact_real_inverse (mode, &r))
9720             return NULL_TREE;
9721           elts[i] = build_real (unit_type, r);
9722         }
9723
9724       return build_vector (type, elts);
9725
9726     default:
9727       return NULL_TREE;
9728     }
9729 }
9730
9731 /*  Mask out the tz least significant bits of X of type TYPE where
9732     tz is the number of trailing zeroes in Y.  */
9733 static wide_int
9734 mask_with_tz (tree type, const wide_int &x, const wide_int &y)
9735 {
9736   int tz = wi::ctz (y);
9737   if (tz > 0)
9738     return wi::mask (tz, true, TYPE_PRECISION (type)) & x;
9739   return x;
9740 }
9741
9742 /* Return true when T is an address and is known to be nonzero.
9743    For floating point we further ensure that T is not denormal.
9744    Similar logic is present in nonzero_address in rtlanal.h.
9745
9746    If the return value is based on the assumption that signed overflow
9747    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
9748    change *STRICT_OVERFLOW_P.  */
9749
9750 static bool
9751 tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
9752 {
9753   tree type = TREE_TYPE (t);
9754   enum tree_code code;
9755
9756   /* Doing something useful for floating point would need more work.  */
9757   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
9758     return false;
9759
9760   code = TREE_CODE (t);
9761   switch (TREE_CODE_CLASS (code))
9762     {
9763     case tcc_unary:
9764       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
9765                                               strict_overflow_p);
9766     case tcc_binary:
9767     case tcc_comparison:
9768       return tree_binary_nonzero_warnv_p (code, type,
9769                                                TREE_OPERAND (t, 0),
9770                                                TREE_OPERAND (t, 1),
9771                                                strict_overflow_p);
9772     case tcc_constant:
9773     case tcc_declaration:
9774     case tcc_reference:
9775       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
9776
9777     default:
9778       break;
9779     }
9780
9781   switch (code)
9782     {
9783     case TRUTH_NOT_EXPR:
9784       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
9785                                               strict_overflow_p);
9786
9787     case TRUTH_AND_EXPR:
9788     case TRUTH_OR_EXPR:
9789     case TRUTH_XOR_EXPR:
9790       return tree_binary_nonzero_warnv_p (code, type,
9791                                                TREE_OPERAND (t, 0),
9792                                                TREE_OPERAND (t, 1),
9793                                                strict_overflow_p);
9794
9795     case COND_EXPR:
9796     case CONSTRUCTOR:
9797     case OBJ_TYPE_REF:
9798     case ASSERT_EXPR:
9799     case ADDR_EXPR:
9800     case WITH_SIZE_EXPR:
9801     case SSA_NAME:
9802       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
9803
9804     case COMPOUND_EXPR:
9805     case MODIFY_EXPR:
9806     case BIND_EXPR:
9807       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
9808                                         strict_overflow_p);
9809
9810     case SAVE_EXPR:
9811       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
9812                                         strict_overflow_p);
9813
9814     case CALL_EXPR:
9815       {
9816         tree fndecl = get_callee_fndecl (t);
9817         if (!fndecl) return false;
9818         if (flag_delete_null_pointer_checks && !flag_check_new
9819             && DECL_IS_OPERATOR_NEW (fndecl)
9820             && !TREE_NOTHROW (fndecl))
9821           return true;
9822         if (flag_delete_null_pointer_checks
9823             && lookup_attribute ("returns_nonnull",
9824                  TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
9825           return true;
9826         return alloca_call_p (t);
9827       }
9828
9829     default:
9830       break;
9831     }
9832   return false;
9833 }
9834
9835 /* Return true when T is an address and is known to be nonzero.
9836    Handle warnings about undefined signed overflow.  */
9837
9838 static bool
9839 tree_expr_nonzero_p (tree t)
9840 {
9841   bool ret, strict_overflow_p;
9842
9843   strict_overflow_p = false;
9844   ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
9845   if (strict_overflow_p)
9846     fold_overflow_warning (("assuming signed overflow does not occur when "
9847                             "determining that expression is always "
9848                             "non-zero"),
9849                            WARN_STRICT_OVERFLOW_MISC);
9850   return ret;
9851 }
9852
9853 /* Fold a binary expression of code CODE and type TYPE with operands
9854    OP0 and OP1.  LOC is the location of the resulting expression.
9855    Return the folded expression if folding is successful.  Otherwise,
9856    return NULL_TREE.  */
9857
9858 tree
9859 fold_binary_loc (location_t loc,
9860              enum tree_code code, tree type, tree op0, tree op1)
9861 {
9862   enum tree_code_class kind = TREE_CODE_CLASS (code);
9863   tree arg0, arg1, tem;
9864   tree t1 = NULL_TREE;
9865   bool strict_overflow_p;
9866   unsigned int prec;
9867
9868   gcc_assert (IS_EXPR_CODE_CLASS (kind)
9869               && TREE_CODE_LENGTH (code) == 2
9870               && op0 != NULL_TREE
9871               && op1 != NULL_TREE);
9872
9873   arg0 = op0;
9874   arg1 = op1;
9875
9876   /* Strip any conversions that don't change the mode.  This is
9877      safe for every expression, except for a comparison expression
9878      because its signedness is derived from its operands.  So, in
9879      the latter case, only strip conversions that don't change the
9880      signedness.  MIN_EXPR/MAX_EXPR also need signedness of arguments
9881      preserved.
9882
9883      Note that this is done as an internal manipulation within the
9884      constant folder, in order to find the simplest representation
9885      of the arguments so that their form can be studied.  In any
9886      cases, the appropriate type conversions should be put back in
9887      the tree that will get out of the constant folder.  */
9888
9889   if (kind == tcc_comparison || code == MIN_EXPR || code == MAX_EXPR)
9890     {
9891       STRIP_SIGN_NOPS (arg0);
9892       STRIP_SIGN_NOPS (arg1);
9893     }
9894   else
9895     {
9896       STRIP_NOPS (arg0);
9897       STRIP_NOPS (arg1);
9898     }
9899
9900   /* Note that TREE_CONSTANT isn't enough: static var addresses are
9901      constant but we can't do arithmetic on them.  */
9902   if (CONSTANT_CLASS_P (arg0) && CONSTANT_CLASS_P (arg1))
9903     {
9904       tem = const_binop (code, type, arg0, arg1);
9905       if (tem != NULL_TREE)
9906         {
9907           if (TREE_TYPE (tem) != type)
9908             tem = fold_convert_loc (loc, type, tem);
9909           return tem;
9910         }
9911     }
9912
9913   /* If this is a commutative operation, and ARG0 is a constant, move it
9914      to ARG1 to reduce the number of tests below.  */
9915   if (commutative_tree_code (code)
9916       && tree_swap_operands_p (arg0, arg1, true))
9917     return fold_build2_loc (loc, code, type, op1, op0);
9918
9919   /* Likewise if this is a comparison, and ARG0 is a constant, move it
9920      to ARG1 to reduce the number of tests below.  */
9921   if (kind == tcc_comparison
9922       && tree_swap_operands_p (arg0, arg1, true))
9923     return fold_build2_loc (loc, swap_tree_comparison (code), type, op1, op0);
9924
9925   tem = generic_simplify (loc, code, type, op0, op1);
9926   if (tem)
9927     return tem;
9928
9929   /* ARG0 is the first operand of EXPR, and ARG1 is the second operand.
9930
9931      First check for cases where an arithmetic operation is applied to a
9932      compound, conditional, or comparison operation.  Push the arithmetic
9933      operation inside the compound or conditional to see if any folding
9934      can then be done.  Convert comparison to conditional for this purpose.
9935      The also optimizes non-constant cases that used to be done in
9936      expand_expr.
9937
9938      Before we do that, see if this is a BIT_AND_EXPR or a BIT_IOR_EXPR,
9939      one of the operands is a comparison and the other is a comparison, a
9940      BIT_AND_EXPR with the constant 1, or a truth value.  In that case, the
9941      code below would make the expression more complex.  Change it to a
9942      TRUTH_{AND,OR}_EXPR.  Likewise, convert a similar NE_EXPR to
9943      TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR.  */
9944
9945   if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
9946        || code == EQ_EXPR || code == NE_EXPR)
9947       && TREE_CODE (type) != VECTOR_TYPE
9948       && ((truth_value_p (TREE_CODE (arg0))
9949            && (truth_value_p (TREE_CODE (arg1))
9950                || (TREE_CODE (arg1) == BIT_AND_EXPR
9951                    && integer_onep (TREE_OPERAND (arg1, 1)))))
9952           || (truth_value_p (TREE_CODE (arg1))
9953               && (truth_value_p (TREE_CODE (arg0))
9954                   || (TREE_CODE (arg0) == BIT_AND_EXPR
9955                       && integer_onep (TREE_OPERAND (arg0, 1)))))))
9956     {
9957       tem = fold_build2_loc (loc, code == BIT_AND_EXPR ? TRUTH_AND_EXPR
9958                          : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR
9959                          : TRUTH_XOR_EXPR,
9960                          boolean_type_node,
9961                          fold_convert_loc (loc, boolean_type_node, arg0),
9962                          fold_convert_loc (loc, boolean_type_node, arg1));
9963
9964       if (code == EQ_EXPR)
9965         tem = invert_truthvalue_loc (loc, tem);
9966
9967       return fold_convert_loc (loc, type, tem);
9968     }
9969
9970   if (TREE_CODE_CLASS (code) == tcc_binary
9971       || TREE_CODE_CLASS (code) == tcc_comparison)
9972     {
9973       if (TREE_CODE (arg0) == COMPOUND_EXPR)
9974         {
9975           tem = fold_build2_loc (loc, code, type,
9976                              fold_convert_loc (loc, TREE_TYPE (op0),
9977                                                TREE_OPERAND (arg0, 1)), op1);
9978           return build2_loc (loc, COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
9979                              tem);
9980         }
9981       if (TREE_CODE (arg1) == COMPOUND_EXPR
9982           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
9983         {
9984           tem = fold_build2_loc (loc, code, type, op0,
9985                              fold_convert_loc (loc, TREE_TYPE (op1),
9986                                                TREE_OPERAND (arg1, 1)));
9987           return build2_loc (loc, COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
9988                              tem);
9989         }
9990
9991       if (TREE_CODE (arg0) == COND_EXPR
9992           || TREE_CODE (arg0) == VEC_COND_EXPR
9993           || COMPARISON_CLASS_P (arg0))
9994         {
9995           tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
9996                                                      arg0, arg1,
9997                                                      /*cond_first_p=*/1);
9998           if (tem != NULL_TREE)
9999             return tem;
10000         }
10001
10002       if (TREE_CODE (arg1) == COND_EXPR
10003           || TREE_CODE (arg1) == VEC_COND_EXPR
10004           || COMPARISON_CLASS_P (arg1))
10005         {
10006           tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
10007                                                      arg1, arg0,
10008                                                      /*cond_first_p=*/0);
10009           if (tem != NULL_TREE)
10010             return tem;
10011         }
10012     }
10013
10014   switch (code)
10015     {
10016     case MEM_REF:
10017       /* MEM[&MEM[p, CST1], CST2] -> MEM[p, CST1 + CST2].  */
10018       if (TREE_CODE (arg0) == ADDR_EXPR
10019           && TREE_CODE (TREE_OPERAND (arg0, 0)) == MEM_REF)
10020         {
10021           tree iref = TREE_OPERAND (arg0, 0);
10022           return fold_build2 (MEM_REF, type,
10023                               TREE_OPERAND (iref, 0),
10024                               int_const_binop (PLUS_EXPR, arg1,
10025                                                TREE_OPERAND (iref, 1)));
10026         }
10027
10028       /* MEM[&a.b, CST2] -> MEM[&a, offsetof (a, b) + CST2].  */
10029       if (TREE_CODE (arg0) == ADDR_EXPR
10030           && handled_component_p (TREE_OPERAND (arg0, 0)))
10031         {
10032           tree base;
10033           HOST_WIDE_INT coffset;
10034           base = get_addr_base_and_unit_offset (TREE_OPERAND (arg0, 0),
10035                                                 &coffset);
10036           if (!base)
10037             return NULL_TREE;
10038           return fold_build2 (MEM_REF, type,
10039                               build_fold_addr_expr (base),
10040                               int_const_binop (PLUS_EXPR, arg1,
10041                                                size_int (coffset)));
10042         }
10043
10044       return NULL_TREE;
10045
10046     case POINTER_PLUS_EXPR:
10047       /* INT +p INT -> (PTR)(INT + INT).  Stripping types allows for this. */
10048       if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
10049            && INTEGRAL_TYPE_P (TREE_TYPE (arg0)))
10050         return fold_convert_loc (loc, type,
10051                                  fold_build2_loc (loc, PLUS_EXPR, sizetype,
10052                                               fold_convert_loc (loc, sizetype,
10053                                                                 arg1),
10054                                               fold_convert_loc (loc, sizetype,
10055                                                                 arg0)));
10056
10057       return NULL_TREE;
10058
10059     case PLUS_EXPR:
10060       if (INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
10061         {
10062           /* X + (X / CST) * -CST is X % CST.  */
10063           if (TREE_CODE (arg1) == MULT_EXPR
10064               && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
10065               && operand_equal_p (arg0,
10066                                   TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0))
10067             {
10068               tree cst0 = TREE_OPERAND (TREE_OPERAND (arg1, 0), 1);
10069               tree cst1 = TREE_OPERAND (arg1, 1);
10070               tree sum = fold_binary_loc (loc, PLUS_EXPR, TREE_TYPE (cst1),
10071                                       cst1, cst0);
10072               if (sum && integer_zerop (sum))
10073                 return fold_convert_loc (loc, type,
10074                                          fold_build2_loc (loc, TRUNC_MOD_EXPR,
10075                                                       TREE_TYPE (arg0), arg0,
10076                                                       cst0));
10077             }
10078         }
10079
10080       /* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the same or
10081          one.  Make sure the type is not saturating and has the signedness of
10082          the stripped operands, as fold_plusminus_mult_expr will re-associate.
10083          ??? The latter condition should use TYPE_OVERFLOW_* flags instead.  */
10084       if ((TREE_CODE (arg0) == MULT_EXPR
10085            || TREE_CODE (arg1) == MULT_EXPR)
10086           && !TYPE_SATURATING (type)
10087           && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0))
10088           && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1))
10089           && (!FLOAT_TYPE_P (type) || flag_associative_math))
10090         {
10091           tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
10092           if (tem)
10093             return tem;
10094         }
10095
10096       if (! FLOAT_TYPE_P (type))
10097         {
10098           /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
10099              with a constant, and the two constants have no bits in common,
10100              we should treat this as a BIT_IOR_EXPR since this may produce more
10101              simplifications.  */
10102           if (TREE_CODE (arg0) == BIT_AND_EXPR
10103               && TREE_CODE (arg1) == BIT_AND_EXPR
10104               && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
10105               && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
10106               && wi::bit_and (TREE_OPERAND (arg0, 1),
10107                               TREE_OPERAND (arg1, 1)) == 0)
10108             {
10109               code = BIT_IOR_EXPR;
10110               goto bit_ior;
10111             }
10112
10113           /* Reassociate (plus (plus (mult) (foo)) (mult)) as
10114              (plus (plus (mult) (mult)) (foo)) so that we can
10115              take advantage of the factoring cases below.  */
10116           if (ANY_INTEGRAL_TYPE_P (type)
10117               && TYPE_OVERFLOW_WRAPS (type)
10118               && (((TREE_CODE (arg0) == PLUS_EXPR
10119                     || TREE_CODE (arg0) == MINUS_EXPR)
10120                    && TREE_CODE (arg1) == MULT_EXPR)
10121                   || ((TREE_CODE (arg1) == PLUS_EXPR
10122                        || TREE_CODE (arg1) == MINUS_EXPR)
10123                       && TREE_CODE (arg0) == MULT_EXPR)))
10124             {
10125               tree parg0, parg1, parg, marg;
10126               enum tree_code pcode;
10127
10128               if (TREE_CODE (arg1) == MULT_EXPR)
10129                 parg = arg0, marg = arg1;
10130               else
10131                 parg = arg1, marg = arg0;
10132               pcode = TREE_CODE (parg);
10133               parg0 = TREE_OPERAND (parg, 0);
10134               parg1 = TREE_OPERAND (parg, 1);
10135               STRIP_NOPS (parg0);
10136               STRIP_NOPS (parg1);
10137
10138               if (TREE_CODE (parg0) == MULT_EXPR
10139                   && TREE_CODE (parg1) != MULT_EXPR)
10140                 return fold_build2_loc (loc, pcode, type,
10141                                     fold_build2_loc (loc, PLUS_EXPR, type,
10142                                                  fold_convert_loc (loc, type,
10143                                                                    parg0),
10144                                                  fold_convert_loc (loc, type,
10145                                                                    marg)),
10146                                     fold_convert_loc (loc, type, parg1));
10147               if (TREE_CODE (parg0) != MULT_EXPR
10148                   && TREE_CODE (parg1) == MULT_EXPR)
10149                 return
10150                   fold_build2_loc (loc, PLUS_EXPR, type,
10151                                fold_convert_loc (loc, type, parg0),
10152                                fold_build2_loc (loc, pcode, type,
10153                                             fold_convert_loc (loc, type, marg),
10154                                             fold_convert_loc (loc, type,
10155                                                               parg1)));
10156             }
10157         }
10158       else
10159         {
10160           /* Fold __complex__ ( x, 0 ) + __complex__ ( 0, y )
10161              to __complex__ ( x, y ).  This is not the same for SNaNs or
10162              if signed zeros are involved.  */
10163           if (!HONOR_SNANS (element_mode (arg0))
10164               && !HONOR_SIGNED_ZEROS (element_mode (arg0))
10165               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10166             {
10167               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10168               tree arg0r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0);
10169               tree arg0i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
10170               bool arg0rz = false, arg0iz = false;
10171               if ((arg0r && (arg0rz = real_zerop (arg0r)))
10172                   || (arg0i && (arg0iz = real_zerop (arg0i))))
10173                 {
10174                   tree arg1r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg1);
10175                   tree arg1i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg1);
10176                   if (arg0rz && arg1i && real_zerop (arg1i))
10177                     {
10178                       tree rp = arg1r ? arg1r
10179                                   : build1 (REALPART_EXPR, rtype, arg1);
10180                       tree ip = arg0i ? arg0i
10181                                   : build1 (IMAGPART_EXPR, rtype, arg0);
10182                       return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10183                     }
10184                   else if (arg0iz && arg1r && real_zerop (arg1r))
10185                     {
10186                       tree rp = arg0r ? arg0r
10187                                   : build1 (REALPART_EXPR, rtype, arg0);
10188                       tree ip = arg1i ? arg1i
10189                                   : build1 (IMAGPART_EXPR, rtype, arg1);
10190                       return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10191                     }
10192                 }
10193             }
10194
10195           if (flag_unsafe_math_optimizations
10196               && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10197               && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10198               && (tem = distribute_real_division (loc, code, type, arg0, arg1)))
10199             return tem;
10200
10201           /* Convert a + (b*c + d*e) into (a + b*c) + d*e.
10202              We associate floats only if the user has specified
10203              -fassociative-math.  */
10204           if (flag_associative_math
10205               && TREE_CODE (arg1) == PLUS_EXPR
10206               && TREE_CODE (arg0) != MULT_EXPR)
10207             {
10208               tree tree10 = TREE_OPERAND (arg1, 0);
10209               tree tree11 = TREE_OPERAND (arg1, 1);
10210               if (TREE_CODE (tree11) == MULT_EXPR
10211                   && TREE_CODE (tree10) == MULT_EXPR)
10212                 {
10213                   tree tree0;
10214                   tree0 = fold_build2_loc (loc, PLUS_EXPR, type, arg0, tree10);
10215                   return fold_build2_loc (loc, PLUS_EXPR, type, tree0, tree11);
10216                 }
10217             }
10218           /* Convert (b*c + d*e) + a into b*c + (d*e +a).
10219              We associate floats only if the user has specified
10220              -fassociative-math.  */
10221           if (flag_associative_math
10222               && TREE_CODE (arg0) == PLUS_EXPR
10223               && TREE_CODE (arg1) != MULT_EXPR)
10224             {
10225               tree tree00 = TREE_OPERAND (arg0, 0);
10226               tree tree01 = TREE_OPERAND (arg0, 1);
10227               if (TREE_CODE (tree01) == MULT_EXPR
10228                   && TREE_CODE (tree00) == MULT_EXPR)
10229                 {
10230                   tree tree0;
10231                   tree0 = fold_build2_loc (loc, PLUS_EXPR, type, tree01, arg1);
10232                   return fold_build2_loc (loc, PLUS_EXPR, type, tree00, tree0);
10233                 }
10234             }
10235         }
10236
10237      bit_rotate:
10238       /* (A << C1) + (A >> C2) if A is unsigned and C1+C2 is the size of A
10239          is a rotate of A by C1 bits.  */
10240       /* (A << B) + (A >> (Z - B)) if A is unsigned and Z is the size of A
10241          is a rotate of A by B bits.  */
10242       {
10243         enum tree_code code0, code1;
10244         tree rtype;
10245         code0 = TREE_CODE (arg0);
10246         code1 = TREE_CODE (arg1);
10247         if (((code0 == RSHIFT_EXPR && code1 == LSHIFT_EXPR)
10248              || (code1 == RSHIFT_EXPR && code0 == LSHIFT_EXPR))
10249             && operand_equal_p (TREE_OPERAND (arg0, 0),
10250                                 TREE_OPERAND (arg1, 0), 0)
10251             && (rtype = TREE_TYPE (TREE_OPERAND (arg0, 0)),
10252                 TYPE_UNSIGNED (rtype))
10253             /* Only create rotates in complete modes.  Other cases are not
10254                expanded properly.  */
10255             && (element_precision (rtype)
10256                 == element_precision (TYPE_MODE (rtype))))
10257           {
10258             tree tree01, tree11;
10259             enum tree_code code01, code11;
10260
10261             tree01 = TREE_OPERAND (arg0, 1);
10262             tree11 = TREE_OPERAND (arg1, 1);
10263             STRIP_NOPS (tree01);
10264             STRIP_NOPS (tree11);
10265             code01 = TREE_CODE (tree01);
10266             code11 = TREE_CODE (tree11);
10267             if (code01 == INTEGER_CST
10268                 && code11 == INTEGER_CST
10269                 && (wi::to_widest (tree01) + wi::to_widest (tree11)
10270                     == element_precision (TREE_TYPE (TREE_OPERAND (arg0, 0)))))
10271               {
10272                 tem = build2_loc (loc, LROTATE_EXPR,
10273                                   TREE_TYPE (TREE_OPERAND (arg0, 0)),
10274                                   TREE_OPERAND (arg0, 0),
10275                                   code0 == LSHIFT_EXPR
10276                                   ? TREE_OPERAND (arg0, 1)
10277                                   : TREE_OPERAND (arg1, 1));
10278                 return fold_convert_loc (loc, type, tem);
10279               }
10280             else if (code11 == MINUS_EXPR)
10281               {
10282                 tree tree110, tree111;
10283                 tree110 = TREE_OPERAND (tree11, 0);
10284                 tree111 = TREE_OPERAND (tree11, 1);
10285                 STRIP_NOPS (tree110);
10286                 STRIP_NOPS (tree111);
10287                 if (TREE_CODE (tree110) == INTEGER_CST
10288                     && 0 == compare_tree_int (tree110,
10289                                               element_precision
10290                                               (TREE_TYPE (TREE_OPERAND
10291                                                           (arg0, 0))))
10292                     && operand_equal_p (tree01, tree111, 0))
10293                   return
10294                     fold_convert_loc (loc, type,
10295                                       build2 ((code0 == LSHIFT_EXPR
10296                                                ? LROTATE_EXPR
10297                                                : RROTATE_EXPR),
10298                                               TREE_TYPE (TREE_OPERAND (arg0, 0)),
10299                                               TREE_OPERAND (arg0, 0),
10300                                               TREE_OPERAND (arg0, 1)));
10301               }
10302             else if (code01 == MINUS_EXPR)
10303               {
10304                 tree tree010, tree011;
10305                 tree010 = TREE_OPERAND (tree01, 0);
10306                 tree011 = TREE_OPERAND (tree01, 1);
10307                 STRIP_NOPS (tree010);
10308                 STRIP_NOPS (tree011);
10309                 if (TREE_CODE (tree010) == INTEGER_CST
10310                     && 0 == compare_tree_int (tree010,
10311                                               element_precision
10312                                               (TREE_TYPE (TREE_OPERAND
10313                                                           (arg0, 0))))
10314                     && operand_equal_p (tree11, tree011, 0))
10315                     return fold_convert_loc
10316                       (loc, type,
10317                        build2 ((code0 != LSHIFT_EXPR
10318                                 ? LROTATE_EXPR
10319                                 : RROTATE_EXPR),
10320                                TREE_TYPE (TREE_OPERAND (arg0, 0)),
10321                                TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 1)));
10322               }
10323           }
10324       }
10325
10326     associate:
10327       /* In most languages, can't associate operations on floats through
10328          parentheses.  Rather than remember where the parentheses were, we
10329          don't associate floats at all, unless the user has specified
10330          -fassociative-math.
10331          And, we need to make sure type is not saturating.  */
10332
10333       if ((! FLOAT_TYPE_P (type) || flag_associative_math)
10334           && !TYPE_SATURATING (type))
10335         {
10336           tree var0, con0, lit0, minus_lit0;
10337           tree var1, con1, lit1, minus_lit1;
10338           tree atype = type;
10339           bool ok = true;
10340
10341           /* Split both trees into variables, constants, and literals.  Then
10342              associate each group together, the constants with literals,
10343              then the result with variables.  This increases the chances of
10344              literals being recombined later and of generating relocatable
10345              expressions for the sum of a constant and literal.  */
10346           var0 = split_tree (arg0, code, &con0, &lit0, &minus_lit0, 0);
10347           var1 = split_tree (arg1, code, &con1, &lit1, &minus_lit1,
10348                              code == MINUS_EXPR);
10349
10350           /* Recombine MINUS_EXPR operands by using PLUS_EXPR.  */
10351           if (code == MINUS_EXPR)
10352             code = PLUS_EXPR;
10353
10354           /* With undefined overflow prefer doing association in a type
10355              which wraps on overflow, if that is one of the operand types.  */
10356           if ((POINTER_TYPE_P (type) && POINTER_TYPE_OVERFLOW_UNDEFINED)
10357               || (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type)))
10358             {
10359               if (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
10360                   && TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0)))
10361                 atype = TREE_TYPE (arg0);
10362               else if (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
10363                        && TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1)))
10364                 atype = TREE_TYPE (arg1);
10365               gcc_assert (TYPE_PRECISION (atype) == TYPE_PRECISION (type));
10366             }
10367
10368           /* With undefined overflow we can only associate constants with one
10369              variable, and constants whose association doesn't overflow.  */
10370           if ((POINTER_TYPE_P (atype) && POINTER_TYPE_OVERFLOW_UNDEFINED)
10371               || (INTEGRAL_TYPE_P (atype) && !TYPE_OVERFLOW_WRAPS (atype)))
10372             {
10373               if (var0 && var1)
10374                 {
10375                   tree tmp0 = var0;
10376                   tree tmp1 = var1;
10377
10378                   if (TREE_CODE (tmp0) == NEGATE_EXPR)
10379                     tmp0 = TREE_OPERAND (tmp0, 0);
10380                   if (CONVERT_EXPR_P (tmp0)
10381                       && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (tmp0, 0)))
10382                       && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (tmp0, 0)))
10383                           <= TYPE_PRECISION (atype)))
10384                     tmp0 = TREE_OPERAND (tmp0, 0);
10385                   if (TREE_CODE (tmp1) == NEGATE_EXPR)
10386                     tmp1 = TREE_OPERAND (tmp1, 0);
10387                   if (CONVERT_EXPR_P (tmp1)
10388                       && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (tmp1, 0)))
10389                       && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (tmp1, 0)))
10390                           <= TYPE_PRECISION (atype)))
10391                     tmp1 = TREE_OPERAND (tmp1, 0);
10392                   /* The only case we can still associate with two variables
10393                      is if they are the same, modulo negation and bit-pattern
10394                      preserving conversions.  */
10395                   if (!operand_equal_p (tmp0, tmp1, 0))
10396                     ok = false;
10397                 }
10398             }
10399
10400           /* Only do something if we found more than two objects.  Otherwise,
10401              nothing has changed and we risk infinite recursion.  */
10402           if (ok
10403               && (2 < ((var0 != 0) + (var1 != 0)
10404                        + (con0 != 0) + (con1 != 0)
10405                        + (lit0 != 0) + (lit1 != 0)
10406                        + (minus_lit0 != 0) + (minus_lit1 != 0))))
10407             {
10408               bool any_overflows = false;
10409               if (lit0) any_overflows |= TREE_OVERFLOW (lit0);
10410               if (lit1) any_overflows |= TREE_OVERFLOW (lit1);
10411               if (minus_lit0) any_overflows |= TREE_OVERFLOW (minus_lit0);
10412               if (minus_lit1) any_overflows |= TREE_OVERFLOW (minus_lit1);
10413               var0 = associate_trees (loc, var0, var1, code, atype);
10414               con0 = associate_trees (loc, con0, con1, code, atype);
10415               lit0 = associate_trees (loc, lit0, lit1, code, atype);
10416               minus_lit0 = associate_trees (loc, minus_lit0, minus_lit1,
10417                                             code, atype);
10418
10419               /* Preserve the MINUS_EXPR if the negative part of the literal is
10420                  greater than the positive part.  Otherwise, the multiplicative
10421                  folding code (i.e extract_muldiv) may be fooled in case
10422                  unsigned constants are subtracted, like in the following
10423                  example: ((X*2 + 4) - 8U)/2.  */
10424               if (minus_lit0 && lit0)
10425                 {
10426                   if (TREE_CODE (lit0) == INTEGER_CST
10427                       && TREE_CODE (minus_lit0) == INTEGER_CST
10428                       && tree_int_cst_lt (lit0, minus_lit0))
10429                     {
10430                       minus_lit0 = associate_trees (loc, minus_lit0, lit0,
10431                                                     MINUS_EXPR, atype);
10432                       lit0 = 0;
10433                     }
10434                   else
10435                     {
10436                       lit0 = associate_trees (loc, lit0, minus_lit0,
10437                                               MINUS_EXPR, atype);
10438                       minus_lit0 = 0;
10439                     }
10440                 }
10441
10442               /* Don't introduce overflows through reassociation.  */
10443               if (!any_overflows
10444                   && ((lit0 && TREE_OVERFLOW_P (lit0))
10445                       || (minus_lit0 && TREE_OVERFLOW_P (minus_lit0))))
10446                 return NULL_TREE;
10447
10448               if (minus_lit0)
10449                 {
10450                   if (con0 == 0)
10451                     return
10452                       fold_convert_loc (loc, type,
10453                                         associate_trees (loc, var0, minus_lit0,
10454                                                          MINUS_EXPR, atype));
10455                   else
10456                     {
10457                       con0 = associate_trees (loc, con0, minus_lit0,
10458                                               MINUS_EXPR, atype);
10459                       return
10460                         fold_convert_loc (loc, type,
10461                                           associate_trees (loc, var0, con0,
10462                                                            PLUS_EXPR, atype));
10463                     }
10464                 }
10465
10466               con0 = associate_trees (loc, con0, lit0, code, atype);
10467               return
10468                 fold_convert_loc (loc, type, associate_trees (loc, var0, con0,
10469                                                               code, atype));
10470             }
10471         }
10472
10473       return NULL_TREE;
10474
10475     case MINUS_EXPR:
10476       /* Pointer simplifications for subtraction, simple reassociations. */
10477       if (POINTER_TYPE_P (TREE_TYPE (arg1)) && POINTER_TYPE_P (TREE_TYPE (arg0)))
10478         {
10479           /* (PTR0 p+ A) - (PTR1 p+ B) -> (PTR0 - PTR1) + (A - B) */
10480           if (TREE_CODE (arg0) == POINTER_PLUS_EXPR
10481               && TREE_CODE (arg1) == POINTER_PLUS_EXPR)
10482             {
10483               tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
10484               tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
10485               tree arg10 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
10486               tree arg11 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
10487               return fold_build2_loc (loc, PLUS_EXPR, type,
10488                                   fold_build2_loc (loc, MINUS_EXPR, type,
10489                                                arg00, arg10),
10490                                   fold_build2_loc (loc, MINUS_EXPR, type,
10491                                                arg01, arg11));
10492             }
10493           /* (PTR0 p+ A) - PTR1 -> (PTR0 - PTR1) + A, assuming PTR0 - PTR1 simplifies. */
10494           else if (TREE_CODE (arg0) == POINTER_PLUS_EXPR)
10495             {
10496               tree arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
10497               tree arg01 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
10498               tree tmp = fold_binary_loc (loc, MINUS_EXPR, type, arg00,
10499                                       fold_convert_loc (loc, type, arg1));
10500               if (tmp)
10501                 return fold_build2_loc (loc, PLUS_EXPR, type, tmp, arg01);
10502             }
10503           /* PTR0 - (PTR1 p+ A) -> (PTR0 - PTR1) - A, assuming PTR0 - PTR1
10504              simplifies. */
10505           else if (TREE_CODE (arg1) == POINTER_PLUS_EXPR)
10506             {
10507               tree arg10 = fold_convert_loc (loc, type,
10508                                              TREE_OPERAND (arg1, 0));
10509               tree arg11 = fold_convert_loc (loc, type,
10510                                              TREE_OPERAND (arg1, 1));
10511               tree tmp = fold_binary_loc (loc, MINUS_EXPR, type,
10512                                           fold_convert_loc (loc, type, arg0),
10513                                           arg10);
10514               if (tmp)
10515                 return fold_build2_loc (loc, MINUS_EXPR, type, tmp, arg11);
10516             }
10517         }
10518       /* (-A) - B -> (-B) - A  where B is easily negated and we can swap.  */
10519       if (TREE_CODE (arg0) == NEGATE_EXPR
10520           && negate_expr_p (arg1)
10521           && reorder_operands_p (arg0, arg1))
10522         return fold_build2_loc (loc, MINUS_EXPR, type,
10523                             fold_convert_loc (loc, type,
10524                                               negate_expr (arg1)),
10525                             fold_convert_loc (loc, type,
10526                                               TREE_OPERAND (arg0, 0)));
10527
10528       /* X - (X / Y) * Y is X % Y.  */
10529       if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
10530           && TREE_CODE (arg1) == MULT_EXPR
10531           && TREE_CODE (TREE_OPERAND (arg1, 0)) == TRUNC_DIV_EXPR
10532           && operand_equal_p (arg0,
10533                               TREE_OPERAND (TREE_OPERAND (arg1, 0), 0), 0)
10534           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg1, 0), 1),
10535                               TREE_OPERAND (arg1, 1), 0))
10536         return
10537           fold_convert_loc (loc, type,
10538                             fold_build2_loc (loc, TRUNC_MOD_EXPR, TREE_TYPE (arg0),
10539                                          arg0, TREE_OPERAND (arg1, 1)));
10540
10541       if (! FLOAT_TYPE_P (type))
10542         {
10543           /* Fold A - (A & B) into ~B & A.  */
10544           if (!TREE_SIDE_EFFECTS (arg0)
10545               && TREE_CODE (arg1) == BIT_AND_EXPR)
10546             {
10547               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0))
10548                 {
10549                   tree arg10 = fold_convert_loc (loc, type,
10550                                                  TREE_OPERAND (arg1, 0));
10551                   return fold_build2_loc (loc, BIT_AND_EXPR, type,
10552                                       fold_build1_loc (loc, BIT_NOT_EXPR,
10553                                                    type, arg10),
10554                                       fold_convert_loc (loc, type, arg0));
10555                 }
10556               if (operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10557                 {
10558                   tree arg11 = fold_convert_loc (loc,
10559                                                  type, TREE_OPERAND (arg1, 1));
10560                   return fold_build2_loc (loc, BIT_AND_EXPR, type,
10561                                       fold_build1_loc (loc, BIT_NOT_EXPR,
10562                                                    type, arg11),
10563                                       fold_convert_loc (loc, type, arg0));
10564                 }
10565             }
10566
10567           /* Fold (A & ~B) - (A & B) into (A ^ B) - B, where B is
10568              any power of 2 minus 1.  */
10569           if (TREE_CODE (arg0) == BIT_AND_EXPR
10570               && TREE_CODE (arg1) == BIT_AND_EXPR
10571               && operand_equal_p (TREE_OPERAND (arg0, 0),
10572                                   TREE_OPERAND (arg1, 0), 0))
10573             {
10574               tree mask0 = TREE_OPERAND (arg0, 1);
10575               tree mask1 = TREE_OPERAND (arg1, 1);
10576               tree tem = fold_build1_loc (loc, BIT_NOT_EXPR, type, mask0);
10577
10578               if (operand_equal_p (tem, mask1, 0))
10579                 {
10580                   tem = fold_build2_loc (loc, BIT_XOR_EXPR, type,
10581                                      TREE_OPERAND (arg0, 0), mask1);
10582                   return fold_build2_loc (loc, MINUS_EXPR, type, tem, mask1);
10583                 }
10584             }
10585         }
10586
10587       /* Fold __complex__ ( x, 0 ) - __complex__ ( 0, y ) to
10588          __complex__ ( x, -y ).  This is not the same for SNaNs or if
10589          signed zeros are involved.  */
10590       if (!HONOR_SNANS (element_mode (arg0))
10591           && !HONOR_SIGNED_ZEROS (element_mode (arg0))
10592           && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0)))
10593         {
10594           tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10595           tree arg0r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0);
10596           tree arg0i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
10597           bool arg0rz = false, arg0iz = false;
10598           if ((arg0r && (arg0rz = real_zerop (arg0r)))
10599               || (arg0i && (arg0iz = real_zerop (arg0i))))
10600             {
10601               tree arg1r = fold_unary_loc (loc, REALPART_EXPR, rtype, arg1);
10602               tree arg1i = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg1);
10603               if (arg0rz && arg1i && real_zerop (arg1i))
10604                 {
10605                   tree rp = fold_build1_loc (loc, NEGATE_EXPR, rtype,
10606                                          arg1r ? arg1r
10607                                          : build1 (REALPART_EXPR, rtype, arg1));
10608                   tree ip = arg0i ? arg0i
10609                     : build1 (IMAGPART_EXPR, rtype, arg0);
10610                   return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10611                 }
10612               else if (arg0iz && arg1r && real_zerop (arg1r))
10613                 {
10614                   tree rp = arg0r ? arg0r
10615                     : build1 (REALPART_EXPR, rtype, arg0);
10616                   tree ip = fold_build1_loc (loc, NEGATE_EXPR, rtype,
10617                                          arg1i ? arg1i
10618                                          : build1 (IMAGPART_EXPR, rtype, arg1));
10619                   return fold_build2_loc (loc, COMPLEX_EXPR, type, rp, ip);
10620                 }
10621             }
10622         }
10623
10624       /* A - B -> A + (-B) if B is easily negatable.  */
10625       if (negate_expr_p (arg1)
10626           && !TYPE_OVERFLOW_SANITIZED (type)
10627           && ((FLOAT_TYPE_P (type)
10628                /* Avoid this transformation if B is a positive REAL_CST.  */
10629                && (TREE_CODE (arg1) != REAL_CST
10630                    ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
10631               || INTEGRAL_TYPE_P (type)))
10632         return fold_build2_loc (loc, PLUS_EXPR, type,
10633                             fold_convert_loc (loc, type, arg0),
10634                             fold_convert_loc (loc, type,
10635                                               negate_expr (arg1)));
10636
10637       /* Try folding difference of addresses.  */
10638       {
10639         HOST_WIDE_INT diff;
10640
10641         if ((TREE_CODE (arg0) == ADDR_EXPR
10642              || TREE_CODE (arg1) == ADDR_EXPR)
10643             && ptr_difference_const (arg0, arg1, &diff))
10644           return build_int_cst_type (type, diff);
10645       }
10646
10647       /* Fold &a[i] - &a[j] to i-j.  */
10648       if (TREE_CODE (arg0) == ADDR_EXPR
10649           && TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
10650           && TREE_CODE (arg1) == ADDR_EXPR
10651           && TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
10652         {
10653           tree tem = fold_addr_of_array_ref_difference (loc, type,
10654                                                         TREE_OPERAND (arg0, 0),
10655                                                         TREE_OPERAND (arg1, 0));
10656           if (tem)
10657             return tem;
10658         }
10659
10660       if (FLOAT_TYPE_P (type)
10661           && flag_unsafe_math_optimizations
10662           && (TREE_CODE (arg0) == RDIV_EXPR || TREE_CODE (arg0) == MULT_EXPR)
10663           && (TREE_CODE (arg1) == RDIV_EXPR || TREE_CODE (arg1) == MULT_EXPR)
10664           && (tem = distribute_real_division (loc, code, type, arg0, arg1)))
10665         return tem;
10666
10667       /* Handle (A1 * C1) - (A2 * C2) with A1, A2 or C1, C2 being the same or
10668          one.  Make sure the type is not saturating and has the signedness of
10669          the stripped operands, as fold_plusminus_mult_expr will re-associate.
10670          ??? The latter condition should use TYPE_OVERFLOW_* flags instead.  */
10671       if ((TREE_CODE (arg0) == MULT_EXPR
10672            || TREE_CODE (arg1) == MULT_EXPR)
10673           && !TYPE_SATURATING (type)
10674           && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0))
10675           && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1))
10676           && (!FLOAT_TYPE_P (type) || flag_associative_math))
10677         {
10678           tree tem = fold_plusminus_mult_expr (loc, code, type, arg0, arg1);
10679           if (tem)
10680             return tem;
10681         }
10682
10683       goto associate;
10684
10685     case MULT_EXPR:
10686       /* (-A) * (-B) -> A * B  */
10687       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
10688         return fold_build2_loc (loc, MULT_EXPR, type,
10689                             fold_convert_loc (loc, type,
10690                                               TREE_OPERAND (arg0, 0)),
10691                             fold_convert_loc (loc, type,
10692                                               negate_expr (arg1)));
10693       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
10694         return fold_build2_loc (loc, MULT_EXPR, type,
10695                             fold_convert_loc (loc, type,
10696                                               negate_expr (arg0)),
10697                             fold_convert_loc (loc, type,
10698                                               TREE_OPERAND (arg1, 0)));
10699
10700       if (! FLOAT_TYPE_P (type))
10701         {
10702           /* Transform x * -C into -x * C if x is easily negatable.  */
10703           if (TREE_CODE (arg1) == INTEGER_CST
10704               && tree_int_cst_sgn (arg1) == -1
10705               && negate_expr_p (arg0)
10706               && (tem = negate_expr (arg1)) != arg1
10707               && !TREE_OVERFLOW (tem))
10708             return fold_build2_loc (loc, MULT_EXPR, type,
10709                                 fold_convert_loc (loc, type,
10710                                                   negate_expr (arg0)),
10711                                 tem);
10712
10713           /* (a * (1 << b)) is (a << b)  */
10714           if (TREE_CODE (arg1) == LSHIFT_EXPR
10715               && integer_onep (TREE_OPERAND (arg1, 0)))
10716             return fold_build2_loc (loc, LSHIFT_EXPR, type, op0,
10717                                 TREE_OPERAND (arg1, 1));
10718           if (TREE_CODE (arg0) == LSHIFT_EXPR
10719               && integer_onep (TREE_OPERAND (arg0, 0)))
10720             return fold_build2_loc (loc, LSHIFT_EXPR, type, op1,
10721                                 TREE_OPERAND (arg0, 1));
10722
10723           /* (A + A) * C -> A * 2 * C  */
10724           if (TREE_CODE (arg0) == PLUS_EXPR
10725               && TREE_CODE (arg1) == INTEGER_CST
10726               && operand_equal_p (TREE_OPERAND (arg0, 0),
10727                                   TREE_OPERAND (arg0, 1), 0))
10728             return fold_build2_loc (loc, MULT_EXPR, type,
10729                                 omit_one_operand_loc (loc, type,
10730                                                   TREE_OPERAND (arg0, 0),
10731                                                   TREE_OPERAND (arg0, 1)),
10732                                 fold_build2_loc (loc, MULT_EXPR, type,
10733                                              build_int_cst (type, 2) , arg1));
10734
10735           /* ((T) (X /[ex] C)) * C cancels out if the conversion is
10736              sign-changing only.  */
10737           if (TREE_CODE (arg1) == INTEGER_CST
10738               && TREE_CODE (arg0) == EXACT_DIV_EXPR
10739               && operand_equal_p (arg1, TREE_OPERAND (arg0, 1), 0))
10740             return fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
10741
10742           strict_overflow_p = false;
10743           if (TREE_CODE (arg1) == INTEGER_CST
10744               && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
10745                                              &strict_overflow_p)))
10746             {
10747               if (strict_overflow_p)
10748                 fold_overflow_warning (("assuming signed overflow does not "
10749                                         "occur when simplifying "
10750                                         "multiplication"),
10751                                        WARN_STRICT_OVERFLOW_MISC);
10752               return fold_convert_loc (loc, type, tem);
10753             }
10754
10755           /* Optimize z * conj(z) for integer complex numbers.  */
10756           if (TREE_CODE (arg0) == CONJ_EXPR
10757               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10758             return fold_mult_zconjz (loc, type, arg1);
10759           if (TREE_CODE (arg1) == CONJ_EXPR
10760               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10761             return fold_mult_zconjz (loc, type, arg0);
10762         }
10763       else
10764         {
10765           /* Convert (C1/X)*C2 into (C1*C2)/X.  This transformation may change
10766              the result for floating point types due to rounding so it is applied
10767              only if -fassociative-math was specify.  */
10768           if (flag_associative_math
10769               && TREE_CODE (arg0) == RDIV_EXPR
10770               && TREE_CODE (arg1) == REAL_CST
10771               && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST)
10772             {
10773               tree tem = const_binop (MULT_EXPR, TREE_OPERAND (arg0, 0),
10774                                       arg1);
10775               if (tem)
10776                 return fold_build2_loc (loc, RDIV_EXPR, type, tem,
10777                                     TREE_OPERAND (arg0, 1));
10778             }
10779
10780           /* Strip sign operations from X in X*X, i.e. -Y*-Y -> Y*Y.  */
10781           if (operand_equal_p (arg0, arg1, 0))
10782             {
10783               tree tem = fold_strip_sign_ops (arg0);
10784               if (tem != NULL_TREE)
10785                 {
10786                   tem = fold_convert_loc (loc, type, tem);
10787                   return fold_build2_loc (loc, MULT_EXPR, type, tem, tem);
10788                 }
10789             }
10790
10791           /* Fold z * +-I to __complex__ (-+__imag z, +-__real z).
10792              This is not the same for NaNs or if signed zeros are
10793              involved.  */
10794           if (!HONOR_NANS (arg0)
10795               && !HONOR_SIGNED_ZEROS (element_mode (arg0))
10796               && COMPLEX_FLOAT_TYPE_P (TREE_TYPE (arg0))
10797               && TREE_CODE (arg1) == COMPLEX_CST
10798               && real_zerop (TREE_REALPART (arg1)))
10799             {
10800               tree rtype = TREE_TYPE (TREE_TYPE (arg0));
10801               if (real_onep (TREE_IMAGPART (arg1)))
10802                 return
10803                   fold_build2_loc (loc, COMPLEX_EXPR, type,
10804                                negate_expr (fold_build1_loc (loc, IMAGPART_EXPR,
10805                                                              rtype, arg0)),
10806                                fold_build1_loc (loc, REALPART_EXPR, rtype, arg0));
10807               else if (real_minus_onep (TREE_IMAGPART (arg1)))
10808                 return
10809                   fold_build2_loc (loc, COMPLEX_EXPR, type,
10810                                fold_build1_loc (loc, IMAGPART_EXPR, rtype, arg0),
10811                                negate_expr (fold_build1_loc (loc, REALPART_EXPR,
10812                                                              rtype, arg0)));
10813             }
10814
10815           /* Optimize z * conj(z) for floating point complex numbers.
10816              Guarded by flag_unsafe_math_optimizations as non-finite
10817              imaginary components don't produce scalar results.  */
10818           if (flag_unsafe_math_optimizations
10819               && TREE_CODE (arg0) == CONJ_EXPR
10820               && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10821             return fold_mult_zconjz (loc, type, arg1);
10822           if (flag_unsafe_math_optimizations
10823               && TREE_CODE (arg1) == CONJ_EXPR
10824               && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10825             return fold_mult_zconjz (loc, type, arg0);
10826
10827           if (flag_unsafe_math_optimizations)
10828             {
10829               enum built_in_function fcode0 = builtin_mathfn_code (arg0);
10830               enum built_in_function fcode1 = builtin_mathfn_code (arg1);
10831
10832               /* Optimizations of root(...)*root(...).  */
10833               if (fcode0 == fcode1 && BUILTIN_ROOT_P (fcode0))
10834                 {
10835                   tree rootfn, arg;
10836                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10837                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10838
10839                   /* Optimize sqrt(x)*sqrt(x) as x.  */
10840                   if (BUILTIN_SQRT_P (fcode0)
10841                       && operand_equal_p (arg00, arg10, 0)
10842                       && ! HONOR_SNANS (element_mode (type)))
10843                     return arg00;
10844
10845                   /* Optimize root(x)*root(y) as root(x*y).  */
10846                   rootfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10847                   arg = fold_build2_loc (loc, MULT_EXPR, type, arg00, arg10);
10848                   return build_call_expr_loc (loc, rootfn, 1, arg);
10849                 }
10850
10851               /* Optimize expN(x)*expN(y) as expN(x+y).  */
10852               if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
10853                 {
10854                   tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10855                   tree arg = fold_build2_loc (loc, PLUS_EXPR, type,
10856                                           CALL_EXPR_ARG (arg0, 0),
10857                                           CALL_EXPR_ARG (arg1, 0));
10858                   return build_call_expr_loc (loc, expfn, 1, arg);
10859                 }
10860
10861               /* Optimizations of pow(...)*pow(...).  */
10862               if ((fcode0 == BUILT_IN_POW && fcode1 == BUILT_IN_POW)
10863                   || (fcode0 == BUILT_IN_POWF && fcode1 == BUILT_IN_POWF)
10864                   || (fcode0 == BUILT_IN_POWL && fcode1 == BUILT_IN_POWL))
10865                 {
10866                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10867                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
10868                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10869                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
10870
10871                   /* Optimize pow(x,y)*pow(z,y) as pow(x*z,y).  */
10872                   if (operand_equal_p (arg01, arg11, 0))
10873                     {
10874                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10875                       tree arg = fold_build2_loc (loc, MULT_EXPR, type,
10876                                               arg00, arg10);
10877                       return build_call_expr_loc (loc, powfn, 2, arg, arg01);
10878                     }
10879
10880                   /* Optimize pow(x,y)*pow(x,z) as pow(x,y+z).  */
10881                   if (operand_equal_p (arg00, arg10, 0))
10882                     {
10883                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10884                       tree arg = fold_build2_loc (loc, PLUS_EXPR, type,
10885                                               arg01, arg11);
10886                       return build_call_expr_loc (loc, powfn, 2, arg00, arg);
10887                     }
10888                 }
10889
10890               /* Optimize tan(x)*cos(x) as sin(x).  */
10891               if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_COS)
10892                    || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_COSF)
10893                    || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_COSL)
10894                    || (fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_TAN)
10895                    || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_TANF)
10896                    || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_TANL))
10897                   && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
10898                                       CALL_EXPR_ARG (arg1, 0), 0))
10899                 {
10900                   tree sinfn = mathfn_built_in (type, BUILT_IN_SIN);
10901
10902                   if (sinfn != NULL_TREE)
10903                     return build_call_expr_loc (loc, sinfn, 1,
10904                                             CALL_EXPR_ARG (arg0, 0));
10905                 }
10906
10907               /* Optimize x*pow(x,c) as pow(x,c+1).  */
10908               if (fcode1 == BUILT_IN_POW
10909                   || fcode1 == BUILT_IN_POWF
10910                   || fcode1 == BUILT_IN_POWL)
10911                 {
10912                   tree arg10 = CALL_EXPR_ARG (arg1, 0);
10913                   tree arg11 = CALL_EXPR_ARG (arg1, 1);
10914                   if (TREE_CODE (arg11) == REAL_CST
10915                       && !TREE_OVERFLOW (arg11)
10916                       && operand_equal_p (arg0, arg10, 0))
10917                     {
10918                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
10919                       REAL_VALUE_TYPE c;
10920                       tree arg;
10921
10922                       c = TREE_REAL_CST (arg11);
10923                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10924                       arg = build_real (type, c);
10925                       return build_call_expr_loc (loc, powfn, 2, arg0, arg);
10926                     }
10927                 }
10928
10929               /* Optimize pow(x,c)*x as pow(x,c+1).  */
10930               if (fcode0 == BUILT_IN_POW
10931                   || fcode0 == BUILT_IN_POWF
10932                   || fcode0 == BUILT_IN_POWL)
10933                 {
10934                   tree arg00 = CALL_EXPR_ARG (arg0, 0);
10935                   tree arg01 = CALL_EXPR_ARG (arg0, 1);
10936                   if (TREE_CODE (arg01) == REAL_CST
10937                       && !TREE_OVERFLOW (arg01)
10938                       && operand_equal_p (arg1, arg00, 0))
10939                     {
10940                       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
10941                       REAL_VALUE_TYPE c;
10942                       tree arg;
10943
10944                       c = TREE_REAL_CST (arg01);
10945                       real_arithmetic (&c, PLUS_EXPR, &c, &dconst1);
10946                       arg = build_real (type, c);
10947                       return build_call_expr_loc (loc, powfn, 2, arg1, arg);
10948                     }
10949                 }
10950
10951               /* Canonicalize x*x as pow(x,2.0), which is expanded as x*x.  */
10952               if (!in_gimple_form
10953                   && optimize
10954                   && operand_equal_p (arg0, arg1, 0))
10955                 {
10956                   tree powfn = mathfn_built_in (type, BUILT_IN_POW);
10957
10958                   if (powfn)
10959                     {
10960                       tree arg = build_real (type, dconst2);
10961                       return build_call_expr_loc (loc, powfn, 2, arg0, arg);
10962                     }
10963                 }
10964             }
10965         }
10966       goto associate;
10967
10968     case BIT_IOR_EXPR:
10969     bit_ior:
10970       /* ~X | X is -1.  */
10971       if (TREE_CODE (arg0) == BIT_NOT_EXPR
10972           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
10973         {
10974           t1 = build_zero_cst (type);
10975           t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
10976           return omit_one_operand_loc (loc, type, t1, arg1);
10977         }
10978
10979       /* X | ~X is -1.  */
10980       if (TREE_CODE (arg1) == BIT_NOT_EXPR
10981           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
10982         {
10983           t1 = build_zero_cst (type);
10984           t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
10985           return omit_one_operand_loc (loc, type, t1, arg0);
10986         }
10987
10988       /* Canonicalize (X & C1) | C2.  */
10989       if (TREE_CODE (arg0) == BIT_AND_EXPR
10990           && TREE_CODE (arg1) == INTEGER_CST
10991           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
10992         {
10993           int width = TYPE_PRECISION (type), w;
10994           wide_int c1 = TREE_OPERAND (arg0, 1);
10995           wide_int c2 = arg1;
10996
10997           /* If (C1&C2) == C1, then (X&C1)|C2 becomes (X,C2).  */
10998           if ((c1 & c2) == c1)
10999             return omit_one_operand_loc (loc, type, arg1,
11000                                          TREE_OPERAND (arg0, 0));
11001
11002           wide_int msk = wi::mask (width, false,
11003                                    TYPE_PRECISION (TREE_TYPE (arg1)));
11004
11005           /* If (C1|C2) == ~0 then (X&C1)|C2 becomes X|C2.  */
11006           if (msk.and_not (c1 | c2) == 0)
11007             return fold_build2_loc (loc, BIT_IOR_EXPR, type,
11008                                     TREE_OPERAND (arg0, 0), arg1);
11009
11010           /* Minimize the number of bits set in C1, i.e. C1 := C1 & ~C2,
11011              unless (C1 & ~C2) | (C2 & C3) for some C3 is a mask of some
11012              mode which allows further optimizations.  */
11013           c1 &= msk;
11014           c2 &= msk;
11015           wide_int c3 = c1.and_not (c2);
11016           for (w = BITS_PER_UNIT; w <= width; w <<= 1)
11017             {
11018               wide_int mask = wi::mask (w, false,
11019                                         TYPE_PRECISION (type));
11020               if (((c1 | c2) & mask) == mask && c1.and_not (mask) == 0)
11021                 {
11022                   c3 = mask;
11023                   break;
11024                 }
11025             }
11026
11027           if (c3 != c1)
11028             return fold_build2_loc (loc, BIT_IOR_EXPR, type,
11029                                     fold_build2_loc (loc, BIT_AND_EXPR, type,
11030                                                      TREE_OPERAND (arg0, 0),
11031                                                      wide_int_to_tree (type,
11032                                                                        c3)),
11033                                     arg1);
11034         }
11035
11036       /* (X & ~Y) | (~X & Y) is X ^ Y */
11037       if (TREE_CODE (arg0) == BIT_AND_EXPR
11038           && TREE_CODE (arg1) == BIT_AND_EXPR)
11039         {
11040           tree a0, a1, l0, l1, n0, n1;
11041
11042           a0 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11043           a1 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11044
11045           l0 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11046           l1 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11047           
11048           n0 = fold_build1_loc (loc, BIT_NOT_EXPR, type, l0);
11049           n1 = fold_build1_loc (loc, BIT_NOT_EXPR, type, l1);
11050           
11051           if ((operand_equal_p (n0, a0, 0)
11052                && operand_equal_p (n1, a1, 0))
11053               || (operand_equal_p (n0, a1, 0)
11054                   && operand_equal_p (n1, a0, 0)))
11055             return fold_build2_loc (loc, BIT_XOR_EXPR, type, l0, n1);
11056         }
11057
11058       t1 = distribute_bit_expr (loc, code, type, arg0, arg1);
11059       if (t1 != NULL_TREE)
11060         return t1;
11061
11062       /* Convert (or (not arg0) (not arg1)) to (not (and (arg0) (arg1))).
11063
11064          This results in more efficient code for machines without a NAND
11065          instruction.  Combine will canonicalize to the first form
11066          which will allow use of NAND instructions provided by the
11067          backend if they exist.  */
11068       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11069           && TREE_CODE (arg1) == BIT_NOT_EXPR)
11070         {
11071           return
11072             fold_build1_loc (loc, BIT_NOT_EXPR, type,
11073                          build2 (BIT_AND_EXPR, type,
11074                                  fold_convert_loc (loc, type,
11075                                                    TREE_OPERAND (arg0, 0)),
11076                                  fold_convert_loc (loc, type,
11077                                                    TREE_OPERAND (arg1, 0))));
11078         }
11079
11080       /* See if this can be simplified into a rotate first.  If that
11081          is unsuccessful continue in the association code.  */
11082       goto bit_rotate;
11083
11084     case BIT_XOR_EXPR:
11085       /* ~X ^ X is -1.  */
11086       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11087           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11088         {
11089           t1 = build_zero_cst (type);
11090           t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11091           return omit_one_operand_loc (loc, type, t1, arg1);
11092         }
11093
11094       /* X ^ ~X is -1.  */
11095       if (TREE_CODE (arg1) == BIT_NOT_EXPR
11096           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11097         {
11098           t1 = build_zero_cst (type);
11099           t1 = fold_unary_loc (loc, BIT_NOT_EXPR, type, t1);
11100           return omit_one_operand_loc (loc, type, t1, arg0);
11101         }
11102
11103       /* If we are XORing two BIT_AND_EXPR's, both of which are and'ing
11104          with a constant, and the two constants have no bits in common,
11105          we should treat this as a BIT_IOR_EXPR since this may produce more
11106          simplifications.  */
11107       if (TREE_CODE (arg0) == BIT_AND_EXPR
11108           && TREE_CODE (arg1) == BIT_AND_EXPR
11109           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
11110           && TREE_CODE (TREE_OPERAND (arg1, 1)) == INTEGER_CST
11111           && wi::bit_and (TREE_OPERAND (arg0, 1),
11112                           TREE_OPERAND (arg1, 1)) == 0)
11113         {
11114           code = BIT_IOR_EXPR;
11115           goto bit_ior;
11116         }
11117
11118       /* (X | Y) ^ X -> Y & ~ X*/
11119       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11120           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11121         {
11122           tree t2 = TREE_OPERAND (arg0, 1);
11123           t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1),
11124                             arg1);
11125           t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11126                             fold_convert_loc (loc, type, t2),
11127                             fold_convert_loc (loc, type, t1));
11128           return t1;
11129         }
11130
11131       /* (Y | X) ^ X -> Y & ~ X*/
11132       if (TREE_CODE (arg0) == BIT_IOR_EXPR
11133           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11134         {
11135           tree t2 = TREE_OPERAND (arg0, 0);
11136           t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1),
11137                             arg1);
11138           t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11139                             fold_convert_loc (loc, type, t2),
11140                             fold_convert_loc (loc, type, t1));
11141           return t1;
11142         }
11143
11144       /* X ^ (X | Y) -> Y & ~ X*/
11145       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11146           && operand_equal_p (TREE_OPERAND (arg1, 0), arg0, 0))
11147         {
11148           tree t2 = TREE_OPERAND (arg1, 1);
11149           t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg0),
11150                             arg0);
11151           t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11152                             fold_convert_loc (loc, type, t2),
11153                             fold_convert_loc (loc, type, t1));
11154           return t1;
11155         }
11156
11157       /* X ^ (Y | X) -> Y & ~ X*/
11158       if (TREE_CODE (arg1) == BIT_IOR_EXPR
11159           && operand_equal_p (TREE_OPERAND (arg1, 1), arg0, 0))
11160         {
11161           tree t2 = TREE_OPERAND (arg1, 0);
11162           t1 = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg0),
11163                             arg0);
11164           t1 = fold_build2_loc (loc, BIT_AND_EXPR, type,
11165                             fold_convert_loc (loc, type, t2),
11166                             fold_convert_loc (loc, type, t1));
11167           return t1;
11168         }
11169
11170       /* Convert ~X ^ ~Y to X ^ Y.  */
11171       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11172           && TREE_CODE (arg1) == BIT_NOT_EXPR)
11173         return fold_build2_loc (loc, code, type,
11174                             fold_convert_loc (loc, type,
11175                                               TREE_OPERAND (arg0, 0)),
11176                             fold_convert_loc (loc, type,
11177                                               TREE_OPERAND (arg1, 0)));
11178
11179       /* Convert ~X ^ C to X ^ ~C.  */
11180       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11181           && TREE_CODE (arg1) == INTEGER_CST)
11182         return fold_build2_loc (loc, code, type,
11183                             fold_convert_loc (loc, type,
11184                                               TREE_OPERAND (arg0, 0)),
11185                             fold_build1_loc (loc, BIT_NOT_EXPR, type, arg1));
11186
11187       /* Fold (X & 1) ^ 1 as (X & 1) == 0.  */
11188       if (TREE_CODE (arg0) == BIT_AND_EXPR
11189           && INTEGRAL_TYPE_P (type)
11190           && integer_onep (TREE_OPERAND (arg0, 1))
11191           && integer_onep (arg1))
11192         return fold_build2_loc (loc, EQ_EXPR, type, arg0,
11193                                 build_zero_cst (TREE_TYPE (arg0)));
11194
11195       /* Fold (X & Y) ^ Y as ~X & Y.  */
11196       if (TREE_CODE (arg0) == BIT_AND_EXPR
11197           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11198         {
11199           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11200           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11201                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11202                               fold_convert_loc (loc, type, arg1));
11203         }
11204       /* Fold (X & Y) ^ X as ~Y & X.  */
11205       if (TREE_CODE (arg0) == BIT_AND_EXPR
11206           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11207           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11208         {
11209           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11210           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11211                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11212                               fold_convert_loc (loc, type, arg1));
11213         }
11214       /* Fold X ^ (X & Y) as X & ~Y.  */
11215       if (TREE_CODE (arg1) == BIT_AND_EXPR
11216           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11217         {
11218           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11219           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11220                               fold_convert_loc (loc, type, arg0),
11221                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem));
11222         }
11223       /* Fold X ^ (Y & X) as ~Y & X.  */
11224       if (TREE_CODE (arg1) == BIT_AND_EXPR
11225           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11226           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11227         {
11228           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11229           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11230                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11231                               fold_convert_loc (loc, type, arg0));
11232         }
11233
11234       /* See if this can be simplified into a rotate first.  If that
11235          is unsuccessful continue in the association code.  */
11236       goto bit_rotate;
11237
11238     case BIT_AND_EXPR:
11239       /* ~X & X, (X == 0) & X, and !X & X are always zero.  */
11240       if ((TREE_CODE (arg0) == BIT_NOT_EXPR
11241            || TREE_CODE (arg0) == TRUTH_NOT_EXPR
11242            || (TREE_CODE (arg0) == EQ_EXPR
11243                && integer_zerop (TREE_OPERAND (arg0, 1))))
11244           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
11245         return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
11246
11247       /* X & ~X , X & (X == 0), and X & !X are always zero.  */
11248       if ((TREE_CODE (arg1) == BIT_NOT_EXPR
11249            || TREE_CODE (arg1) == TRUTH_NOT_EXPR
11250            || (TREE_CODE (arg1) == EQ_EXPR
11251                && integer_zerop (TREE_OPERAND (arg1, 1))))
11252           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11253         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
11254
11255       /* Fold (X ^ 1) & 1 as (X & 1) == 0.  */
11256       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11257           && INTEGRAL_TYPE_P (type)
11258           && integer_onep (TREE_OPERAND (arg0, 1))
11259           && integer_onep (arg1))
11260         {
11261           tree tem2;
11262           tem = TREE_OPERAND (arg0, 0);
11263           tem2 = fold_convert_loc (loc, TREE_TYPE (tem), arg1);
11264           tem2 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem),
11265                                   tem, tem2);
11266           return fold_build2_loc (loc, EQ_EXPR, type, tem2,
11267                                   build_zero_cst (TREE_TYPE (tem)));
11268         }
11269       /* Fold ~X & 1 as (X & 1) == 0.  */
11270       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11271           && INTEGRAL_TYPE_P (type)
11272           && integer_onep (arg1))
11273         {
11274           tree tem2;
11275           tem = TREE_OPERAND (arg0, 0);
11276           tem2 = fold_convert_loc (loc, TREE_TYPE (tem), arg1);
11277           tem2 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem),
11278                                   tem, tem2);
11279           return fold_build2_loc (loc, EQ_EXPR, type, tem2,
11280                                   build_zero_cst (TREE_TYPE (tem)));
11281         }
11282       /* Fold !X & 1 as X == 0.  */
11283       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
11284           && integer_onep (arg1))
11285         {
11286           tem = TREE_OPERAND (arg0, 0);
11287           return fold_build2_loc (loc, EQ_EXPR, type, tem,
11288                                   build_zero_cst (TREE_TYPE (tem)));
11289         }
11290
11291       /* Fold (X ^ Y) & Y as ~X & Y.  */
11292       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11293           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
11294         {
11295           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11296           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11297                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11298                               fold_convert_loc (loc, type, arg1));
11299         }
11300       /* Fold (X ^ Y) & X as ~Y & X.  */
11301       if (TREE_CODE (arg0) == BIT_XOR_EXPR
11302           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
11303           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
11304         {
11305           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
11306           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11307                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11308                               fold_convert_loc (loc, type, arg1));
11309         }
11310       /* Fold X & (X ^ Y) as X & ~Y.  */
11311       if (TREE_CODE (arg1) == BIT_XOR_EXPR
11312           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
11313         {
11314           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
11315           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11316                               fold_convert_loc (loc, type, arg0),
11317                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem));
11318         }
11319       /* Fold X & (Y ^ X) as ~Y & X.  */
11320       if (TREE_CODE (arg1) == BIT_XOR_EXPR
11321           && operand_equal_p (arg0, TREE_OPERAND (arg1, 1), 0)
11322           && reorder_operands_p (arg0, TREE_OPERAND (arg1, 0)))
11323         {
11324           tem = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
11325           return fold_build2_loc (loc, BIT_AND_EXPR, type,
11326                               fold_build1_loc (loc, BIT_NOT_EXPR, type, tem),
11327                               fold_convert_loc (loc, type, arg0));
11328         }
11329
11330       /* Fold (X * Y) & -(1 << CST) to X * Y if Y is a constant
11331          multiple of 1 << CST.  */
11332       if (TREE_CODE (arg1) == INTEGER_CST)
11333         {
11334           wide_int cst1 = arg1;
11335           wide_int ncst1 = -cst1;
11336           if ((cst1 & ncst1) == ncst1
11337               && multiple_of_p (type, arg0,
11338                                 wide_int_to_tree (TREE_TYPE (arg1), ncst1)))
11339             return fold_convert_loc (loc, type, arg0);
11340         }
11341
11342       /* Fold (X * CST1) & CST2 to zero if we can, or drop known zero
11343          bits from CST2.  */
11344       if (TREE_CODE (arg1) == INTEGER_CST
11345           && TREE_CODE (arg0) == MULT_EXPR
11346           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
11347         {
11348           wide_int warg1 = arg1;
11349           wide_int masked = mask_with_tz (type, warg1, TREE_OPERAND (arg0, 1));
11350
11351           if (masked == 0)
11352             return omit_two_operands_loc (loc, type, build_zero_cst (type),
11353                                           arg0, arg1);
11354           else if (masked != warg1)
11355             {
11356               /* Avoid the transform if arg1 is a mask of some
11357                  mode which allows further optimizations.  */
11358               int pop = wi::popcount (warg1);
11359               if (!(pop >= BITS_PER_UNIT
11360                     && exact_log2 (pop) != -1
11361                     && wi::mask (pop, false, warg1.get_precision ()) == warg1))
11362                 return fold_build2_loc (loc, code, type, op0,
11363                                         wide_int_to_tree (type, masked));
11364             }
11365         }
11366
11367       /* For constants M and N, if M == (1LL << cst) - 1 && (N & M) == M,
11368          ((A & N) + B) & M -> (A + B) & M
11369          Similarly if (N & M) == 0,
11370          ((A | N) + B) & M -> (A + B) & M
11371          and for - instead of + (or unary - instead of +)
11372          and/or ^ instead of |.
11373          If B is constant and (B & M) == 0, fold into A & M.  */
11374       if (TREE_CODE (arg1) == INTEGER_CST)
11375         {
11376           wide_int cst1 = arg1;
11377           if ((~cst1 != 0) && (cst1 & (cst1 + 1)) == 0
11378               && INTEGRAL_TYPE_P (TREE_TYPE (arg0))
11379               && (TREE_CODE (arg0) == PLUS_EXPR
11380                   || TREE_CODE (arg0) == MINUS_EXPR
11381                   || TREE_CODE (arg0) == NEGATE_EXPR)
11382               && (TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0))
11383                   || TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE))
11384             {
11385               tree pmop[2];
11386               int which = 0;
11387               wide_int cst0;
11388
11389               /* Now we know that arg0 is (C + D) or (C - D) or
11390                  -C and arg1 (M) is == (1LL << cst) - 1.
11391                  Store C into PMOP[0] and D into PMOP[1].  */
11392               pmop[0] = TREE_OPERAND (arg0, 0);
11393               pmop[1] = NULL;
11394               if (TREE_CODE (arg0) != NEGATE_EXPR)
11395                 {
11396                   pmop[1] = TREE_OPERAND (arg0, 1);
11397                   which = 1;
11398                 }
11399
11400               if ((wi::max_value (TREE_TYPE (arg0)) & cst1) != cst1)
11401                 which = -1;
11402
11403               for (; which >= 0; which--)
11404                 switch (TREE_CODE (pmop[which]))
11405                   {
11406                   case BIT_AND_EXPR:
11407                   case BIT_IOR_EXPR:
11408                   case BIT_XOR_EXPR:
11409                     if (TREE_CODE (TREE_OPERAND (pmop[which], 1))
11410                         != INTEGER_CST)
11411                       break;
11412                     cst0 = TREE_OPERAND (pmop[which], 1);
11413                     cst0 &= cst1;
11414                     if (TREE_CODE (pmop[which]) == BIT_AND_EXPR)
11415                       {
11416                         if (cst0 != cst1)
11417                           break;
11418                       }
11419                     else if (cst0 != 0)
11420                       break;
11421                     /* If C or D is of the form (A & N) where
11422                        (N & M) == M, or of the form (A | N) or
11423                        (A ^ N) where (N & M) == 0, replace it with A.  */
11424                     pmop[which] = TREE_OPERAND (pmop[which], 0);
11425                     break;
11426                   case INTEGER_CST:
11427                     /* If C or D is a N where (N & M) == 0, it can be
11428                        omitted (assumed 0).  */
11429                     if ((TREE_CODE (arg0) == PLUS_EXPR
11430                          || (TREE_CODE (arg0) == MINUS_EXPR && which == 0))
11431                         && (cst1 & pmop[which]) == 0)
11432                       pmop[which] = NULL;
11433                     break;
11434                   default:
11435                     break;
11436                   }
11437
11438               /* Only build anything new if we optimized one or both arguments
11439                  above.  */
11440               if (pmop[0] != TREE_OPERAND (arg0, 0)
11441                   || (TREE_CODE (arg0) != NEGATE_EXPR
11442                       && pmop[1] != TREE_OPERAND (arg0, 1)))
11443                 {
11444                   tree utype = TREE_TYPE (arg0);
11445                   if (! TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0)))
11446                     {
11447                       /* Perform the operations in a type that has defined
11448                          overflow behavior.  */
11449                       utype = unsigned_type_for (TREE_TYPE (arg0));
11450                       if (pmop[0] != NULL)
11451                         pmop[0] = fold_convert_loc (loc, utype, pmop[0]);
11452                       if (pmop[1] != NULL)
11453                         pmop[1] = fold_convert_loc (loc, utype, pmop[1]);
11454                     }
11455
11456                   if (TREE_CODE (arg0) == NEGATE_EXPR)
11457                     tem = fold_build1_loc (loc, NEGATE_EXPR, utype, pmop[0]);
11458                   else if (TREE_CODE (arg0) == PLUS_EXPR)
11459                     {
11460                       if (pmop[0] != NULL && pmop[1] != NULL)
11461                         tem = fold_build2_loc (loc, PLUS_EXPR, utype,
11462                                                pmop[0], pmop[1]);
11463                       else if (pmop[0] != NULL)
11464                         tem = pmop[0];
11465                       else if (pmop[1] != NULL)
11466                         tem = pmop[1];
11467                       else
11468                         return build_int_cst (type, 0);
11469                     }
11470                   else if (pmop[0] == NULL)
11471                     tem = fold_build1_loc (loc, NEGATE_EXPR, utype, pmop[1]);
11472                   else
11473                     tem = fold_build2_loc (loc, MINUS_EXPR, utype,
11474                                            pmop[0], pmop[1]);
11475                   /* TEM is now the new binary +, - or unary - replacement.  */
11476                   tem = fold_build2_loc (loc, BIT_AND_EXPR, utype, tem,
11477                                          fold_convert_loc (loc, utype, arg1));
11478                   return fold_convert_loc (loc, type, tem);
11479                 }
11480             }
11481         }
11482
11483       t1 = distribute_bit_expr (loc, code, type, arg0, arg1);
11484       if (t1 != NULL_TREE)
11485         return t1;
11486       /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char.  */
11487       if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR
11488           && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0))))
11489         {
11490           prec = element_precision (TREE_TYPE (TREE_OPERAND (arg0, 0)));
11491
11492           wide_int mask = wide_int::from (arg1, prec, UNSIGNED);
11493           if (mask == -1)
11494             return
11495               fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
11496         }
11497
11498       /* Convert (and (not arg0) (not arg1)) to (not (or (arg0) (arg1))).
11499
11500          This results in more efficient code for machines without a NOR
11501          instruction.  Combine will canonicalize to the first form
11502          which will allow use of NOR instructions provided by the
11503          backend if they exist.  */
11504       if (TREE_CODE (arg0) == BIT_NOT_EXPR
11505           && TREE_CODE (arg1) == BIT_NOT_EXPR)
11506         {
11507           return fold_build1_loc (loc, BIT_NOT_EXPR, type,
11508                               build2 (BIT_IOR_EXPR, type,
11509                                       fold_convert_loc (loc, type,
11510                                                         TREE_OPERAND (arg0, 0)),
11511                                       fold_convert_loc (loc, type,
11512                                                         TREE_OPERAND (arg1, 0))));
11513         }
11514
11515       /* If arg0 is derived from the address of an object or function, we may
11516          be able to fold this expression using the object or function's
11517          alignment.  */
11518       if (POINTER_TYPE_P (TREE_TYPE (arg0)) && tree_fits_uhwi_p (arg1))
11519         {
11520           unsigned HOST_WIDE_INT modulus, residue;
11521           unsigned HOST_WIDE_INT low = tree_to_uhwi (arg1);
11522
11523           modulus = get_pointer_modulus_and_residue (arg0, &residue,
11524                                                      integer_onep (arg1));
11525
11526           /* This works because modulus is a power of 2.  If this weren't the
11527              case, we'd have to replace it by its greatest power-of-2
11528              divisor: modulus & -modulus.  */
11529           if (low < modulus)
11530             return build_int_cst (type, residue & low);
11531         }
11532
11533       /* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1))
11534               (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1))
11535          if the new mask might be further optimized.  */
11536       if ((TREE_CODE (arg0) == LSHIFT_EXPR
11537            || TREE_CODE (arg0) == RSHIFT_EXPR)
11538           && TYPE_PRECISION (TREE_TYPE (arg0)) <= HOST_BITS_PER_WIDE_INT
11539           && TREE_CODE (arg1) == INTEGER_CST
11540           && tree_fits_uhwi_p (TREE_OPERAND (arg0, 1))
11541           && tree_to_uhwi (TREE_OPERAND (arg0, 1)) > 0
11542           && (tree_to_uhwi (TREE_OPERAND (arg0, 1))
11543               < TYPE_PRECISION (TREE_TYPE (arg0))))
11544         {
11545           unsigned int shiftc = tree_to_uhwi (TREE_OPERAND (arg0, 1));
11546           unsigned HOST_WIDE_INT mask = TREE_INT_CST_LOW (arg1);
11547           unsigned HOST_WIDE_INT newmask, zerobits = 0;
11548           tree shift_type = TREE_TYPE (arg0);
11549
11550           if (TREE_CODE (arg0) == LSHIFT_EXPR)
11551             zerobits = ((((unsigned HOST_WIDE_INT) 1) << shiftc) - 1);
11552           else if (TREE_CODE (arg0) == RSHIFT_EXPR
11553                    && TYPE_PRECISION (TREE_TYPE (arg0))
11554                       == GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (arg0))))
11555             {
11556               prec = TYPE_PRECISION (TREE_TYPE (arg0));
11557               tree arg00 = TREE_OPERAND (arg0, 0);
11558               /* See if more bits can be proven as zero because of
11559                  zero extension.  */
11560               if (TREE_CODE (arg00) == NOP_EXPR
11561                   && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0))))
11562                 {
11563                   tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0));
11564                   if (TYPE_PRECISION (inner_type)
11565                       == GET_MODE_PRECISION (TYPE_MODE (inner_type))
11566                       && TYPE_PRECISION (inner_type) < prec)
11567                     {
11568                       prec = TYPE_PRECISION (inner_type);
11569                       /* See if we can shorten the right shift.  */
11570                       if (shiftc < prec)
11571                         shift_type = inner_type;
11572                       /* Otherwise X >> C1 is all zeros, so we'll optimize
11573                          it into (X, 0) later on by making sure zerobits
11574                          is all ones.  */
11575                     }
11576                 }
11577               zerobits = ~(unsigned HOST_WIDE_INT) 0;
11578               if (shiftc < prec)
11579                 {
11580                   zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
11581                   zerobits <<= prec - shiftc;
11582                 }
11583               /* For arithmetic shift if sign bit could be set, zerobits
11584                  can contain actually sign bits, so no transformation is
11585                  possible, unless MASK masks them all away.  In that
11586                  case the shift needs to be converted into logical shift.  */
11587               if (!TYPE_UNSIGNED (TREE_TYPE (arg0))
11588                   && prec == TYPE_PRECISION (TREE_TYPE (arg0)))
11589                 {
11590                   if ((mask & zerobits) == 0)
11591                     shift_type = unsigned_type_for (TREE_TYPE (arg0));
11592                   else
11593                     zerobits = 0;
11594                 }
11595             }
11596
11597           /* ((X << 16) & 0xff00) is (X, 0).  */
11598           if ((mask & zerobits) == mask)
11599             return omit_one_operand_loc (loc, type,
11600                                          build_int_cst (type, 0), arg0);
11601
11602           newmask = mask | zerobits;
11603           if (newmask != mask && (newmask & (newmask + 1)) == 0)
11604             {
11605               /* Only do the transformation if NEWMASK is some integer
11606                  mode's mask.  */
11607               for (prec = BITS_PER_UNIT;
11608                    prec < HOST_BITS_PER_WIDE_INT; prec <<= 1)
11609                 if (newmask == (((unsigned HOST_WIDE_INT) 1) << prec) - 1)
11610                   break;
11611               if (prec < HOST_BITS_PER_WIDE_INT
11612                   || newmask == ~(unsigned HOST_WIDE_INT) 0)
11613                 {
11614                   tree newmaskt;
11615
11616                   if (shift_type != TREE_TYPE (arg0))
11617                     {
11618                       tem = fold_build2_loc (loc, TREE_CODE (arg0), shift_type,
11619                                          fold_convert_loc (loc, shift_type,
11620                                                            TREE_OPERAND (arg0, 0)),
11621                                          TREE_OPERAND (arg0, 1));
11622                       tem = fold_convert_loc (loc, type, tem);
11623                     }
11624                   else
11625                     tem = op0;
11626                   newmaskt = build_int_cst_type (TREE_TYPE (op1), newmask);
11627                   if (!tree_int_cst_equal (newmaskt, arg1))
11628                     return fold_build2_loc (loc, BIT_AND_EXPR, type, tem, newmaskt);
11629                 }
11630             }
11631         }
11632
11633       goto associate;
11634
11635     case RDIV_EXPR:
11636       /* Don't touch a floating-point divide by zero unless the mode
11637          of the constant can represent infinity.  */
11638       if (TREE_CODE (arg1) == REAL_CST
11639           && !MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1)))
11640           && real_zerop (arg1))
11641         return NULL_TREE;
11642
11643       /* (-A) / (-B) -> A / B  */
11644       if (TREE_CODE (arg0) == NEGATE_EXPR && negate_expr_p (arg1))
11645         return fold_build2_loc (loc, RDIV_EXPR, type,
11646                             TREE_OPERAND (arg0, 0),
11647                             negate_expr (arg1));
11648       if (TREE_CODE (arg1) == NEGATE_EXPR && negate_expr_p (arg0))
11649         return fold_build2_loc (loc, RDIV_EXPR, type,
11650                             negate_expr (arg0),
11651                             TREE_OPERAND (arg1, 0));
11652
11653       /* Convert A/B/C to A/(B*C).  */
11654       if (flag_reciprocal_math
11655           && TREE_CODE (arg0) == RDIV_EXPR)
11656         return fold_build2_loc (loc, RDIV_EXPR, type, TREE_OPERAND (arg0, 0),
11657                             fold_build2_loc (loc, MULT_EXPR, type,
11658                                          TREE_OPERAND (arg0, 1), arg1));
11659
11660       /* Convert A/(B/C) to (A/B)*C.  */
11661       if (flag_reciprocal_math
11662           && TREE_CODE (arg1) == RDIV_EXPR)
11663         return fold_build2_loc (loc, MULT_EXPR, type,
11664                             fold_build2_loc (loc, RDIV_EXPR, type, arg0,
11665                                          TREE_OPERAND (arg1, 0)),
11666                             TREE_OPERAND (arg1, 1));
11667
11668       /* Convert C1/(X*C2) into (C1/C2)/X.  */
11669       if (flag_reciprocal_math
11670           && TREE_CODE (arg1) == MULT_EXPR
11671           && TREE_CODE (arg0) == REAL_CST
11672           && TREE_CODE (TREE_OPERAND (arg1, 1)) == REAL_CST)
11673         {
11674           tree tem = const_binop (RDIV_EXPR, arg0,
11675                                   TREE_OPERAND (arg1, 1));
11676           if (tem)
11677             return fold_build2_loc (loc, RDIV_EXPR, type, tem,
11678                                 TREE_OPERAND (arg1, 0));
11679         }
11680
11681       if (flag_unsafe_math_optimizations)
11682         {
11683           enum built_in_function fcode0 = builtin_mathfn_code (arg0);
11684           enum built_in_function fcode1 = builtin_mathfn_code (arg1);
11685
11686           /* Optimize sin(x)/cos(x) as tan(x).  */
11687           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_COS)
11688                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_COSF)
11689                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_COSL))
11690               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11691                                   CALL_EXPR_ARG (arg1, 0), 0))
11692             {
11693               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11694
11695               if (tanfn != NULL_TREE)
11696                 return build_call_expr_loc (loc, tanfn, 1, CALL_EXPR_ARG (arg0, 0));
11697             }
11698
11699           /* Optimize cos(x)/sin(x) as 1.0/tan(x).  */
11700           if (((fcode0 == BUILT_IN_COS && fcode1 == BUILT_IN_SIN)
11701                || (fcode0 == BUILT_IN_COSF && fcode1 == BUILT_IN_SINF)
11702                || (fcode0 == BUILT_IN_COSL && fcode1 == BUILT_IN_SINL))
11703               && operand_equal_p (CALL_EXPR_ARG (arg0, 0),
11704                                   CALL_EXPR_ARG (arg1, 0), 0))
11705             {
11706               tree tanfn = mathfn_built_in (type, BUILT_IN_TAN);
11707
11708               if (tanfn != NULL_TREE)
11709                 {
11710                   tree tmp = build_call_expr_loc (loc, tanfn, 1,
11711                                               CALL_EXPR_ARG (arg0, 0));
11712                   return fold_build2_loc (loc, RDIV_EXPR, type,
11713                                       build_real (type, dconst1), tmp);
11714                 }
11715             }
11716
11717           /* Optimize sin(x)/tan(x) as cos(x) if we don't care about
11718              NaNs or Infinities.  */
11719           if (((fcode0 == BUILT_IN_SIN && fcode1 == BUILT_IN_TAN)
11720                || (fcode0 == BUILT_IN_SINF && fcode1 == BUILT_IN_TANF)
11721                || (fcode0 == BUILT_IN_SINL && fcode1 == BUILT_IN_TANL)))
11722             {
11723               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11724               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11725
11726               if (! HONOR_NANS (arg00)
11727                   && ! HONOR_INFINITIES (element_mode (arg00))
11728                   && operand_equal_p (arg00, arg01, 0))
11729                 {
11730                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11731
11732                   if (cosfn != NULL_TREE)
11733                     return build_call_expr_loc (loc, cosfn, 1, arg00);
11734                 }
11735             }
11736
11737           /* Optimize tan(x)/sin(x) as 1.0/cos(x) if we don't care about
11738              NaNs or Infinities.  */
11739           if (((fcode0 == BUILT_IN_TAN && fcode1 == BUILT_IN_SIN)
11740                || (fcode0 == BUILT_IN_TANF && fcode1 == BUILT_IN_SINF)
11741                || (fcode0 == BUILT_IN_TANL && fcode1 == BUILT_IN_SINL)))
11742             {
11743               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11744               tree arg01 = CALL_EXPR_ARG (arg1, 0);
11745
11746               if (! HONOR_NANS (arg00)
11747                   && ! HONOR_INFINITIES (element_mode (arg00))
11748                   && operand_equal_p (arg00, arg01, 0))
11749                 {
11750                   tree cosfn = mathfn_built_in (type, BUILT_IN_COS);
11751
11752                   if (cosfn != NULL_TREE)
11753                     {
11754                       tree tmp = build_call_expr_loc (loc, cosfn, 1, arg00);
11755                       return fold_build2_loc (loc, RDIV_EXPR, type,
11756                                           build_real (type, dconst1),
11757                                           tmp);
11758                     }
11759                 }
11760             }
11761
11762           /* Optimize pow(x,c)/x as pow(x,c-1).  */
11763           if (fcode0 == BUILT_IN_POW
11764               || fcode0 == BUILT_IN_POWF
11765               || fcode0 == BUILT_IN_POWL)
11766             {
11767               tree arg00 = CALL_EXPR_ARG (arg0, 0);
11768               tree arg01 = CALL_EXPR_ARG (arg0, 1);
11769               if (TREE_CODE (arg01) == REAL_CST
11770                   && !TREE_OVERFLOW (arg01)
11771                   && operand_equal_p (arg1, arg00, 0))
11772                 {
11773                   tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
11774                   REAL_VALUE_TYPE c;
11775                   tree arg;
11776
11777                   c = TREE_REAL_CST (arg01);
11778                   real_arithmetic (&c, MINUS_EXPR, &c, &dconst1);
11779                   arg = build_real (type, c);
11780                   return build_call_expr_loc (loc, powfn, 2, arg1, arg);
11781                 }
11782             }
11783
11784           /* Optimize a/root(b/c) into a*root(c/b).  */
11785           if (BUILTIN_ROOT_P (fcode1))
11786             {
11787               tree rootarg = CALL_EXPR_ARG (arg1, 0);
11788
11789               if (TREE_CODE (rootarg) == RDIV_EXPR)
11790                 {
11791                   tree rootfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11792                   tree b = TREE_OPERAND (rootarg, 0);
11793                   tree c = TREE_OPERAND (rootarg, 1);
11794
11795                   tree tmp = fold_build2_loc (loc, RDIV_EXPR, type, c, b);
11796
11797                   tmp = build_call_expr_loc (loc, rootfn, 1, tmp);
11798                   return fold_build2_loc (loc, MULT_EXPR, type, arg0, tmp);
11799                 }
11800             }
11801
11802           /* Optimize x/expN(y) into x*expN(-y).  */
11803           if (BUILTIN_EXPONENT_P (fcode1))
11804             {
11805               tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11806               tree arg = negate_expr (CALL_EXPR_ARG (arg1, 0));
11807               arg1 = build_call_expr_loc (loc,
11808                                       expfn, 1,
11809                                       fold_convert_loc (loc, type, arg));
11810               return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
11811             }
11812
11813           /* Optimize x/pow(y,z) into x*pow(y,-z).  */
11814           if (fcode1 == BUILT_IN_POW
11815               || fcode1 == BUILT_IN_POWF
11816               || fcode1 == BUILT_IN_POWL)
11817             {
11818               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg1), 0);
11819               tree arg10 = CALL_EXPR_ARG (arg1, 0);
11820               tree arg11 = CALL_EXPR_ARG (arg1, 1);
11821               tree neg11 = fold_convert_loc (loc, type,
11822                                              negate_expr (arg11));
11823               arg1 = build_call_expr_loc (loc, powfn, 2, arg10, neg11);
11824               return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
11825             }
11826         }
11827       return NULL_TREE;
11828
11829     case TRUNC_DIV_EXPR:
11830       /* Optimize (X & (-A)) / A where A is a power of 2,
11831          to X >> log2(A) */
11832       if (TREE_CODE (arg0) == BIT_AND_EXPR
11833           && !TYPE_UNSIGNED (type) && TREE_CODE (arg1) == INTEGER_CST
11834           && integer_pow2p (arg1) && tree_int_cst_sgn (arg1) > 0)
11835         {
11836           tree sum = fold_binary_loc (loc, PLUS_EXPR, TREE_TYPE (arg1),
11837                                       arg1, TREE_OPERAND (arg0, 1));
11838           if (sum && integer_zerop (sum)) {
11839             tree pow2 = build_int_cst (integer_type_node,
11840                                        wi::exact_log2 (arg1));
11841             return fold_build2_loc (loc, RSHIFT_EXPR, type,
11842                                     TREE_OPERAND (arg0, 0), pow2);
11843           }
11844         }
11845
11846       /* Fall through */
11847       
11848     case FLOOR_DIV_EXPR:
11849       /* Simplify A / (B << N) where A and B are positive and B is
11850          a power of 2, to A >> (N + log2(B)).  */
11851       strict_overflow_p = false;
11852       if (TREE_CODE (arg1) == LSHIFT_EXPR
11853           && (TYPE_UNSIGNED (type)
11854               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11855         {
11856           tree sval = TREE_OPERAND (arg1, 0);
11857           if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
11858             {
11859               tree sh_cnt = TREE_OPERAND (arg1, 1);
11860               tree pow2 = build_int_cst (TREE_TYPE (sh_cnt),
11861                                          wi::exact_log2 (sval));
11862
11863               if (strict_overflow_p)
11864                 fold_overflow_warning (("assuming signed overflow does not "
11865                                         "occur when simplifying A / (B << N)"),
11866                                        WARN_STRICT_OVERFLOW_MISC);
11867
11868               sh_cnt = fold_build2_loc (loc, PLUS_EXPR, TREE_TYPE (sh_cnt),
11869                                         sh_cnt, pow2);
11870               return fold_build2_loc (loc, RSHIFT_EXPR, type,
11871                                       fold_convert_loc (loc, type, arg0), sh_cnt);
11872             }
11873         }
11874
11875       /* Fall through */
11876
11877     case ROUND_DIV_EXPR:
11878     case CEIL_DIV_EXPR:
11879     case EXACT_DIV_EXPR:
11880       if (integer_zerop (arg1))
11881         return NULL_TREE;
11882
11883       /* Convert -A / -B to A / B when the type is signed and overflow is
11884          undefined.  */
11885       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11886           && TREE_CODE (arg0) == NEGATE_EXPR
11887           && negate_expr_p (arg1))
11888         {
11889           if (INTEGRAL_TYPE_P (type))
11890             fold_overflow_warning (("assuming signed overflow does not occur "
11891                                     "when distributing negation across "
11892                                     "division"),
11893                                    WARN_STRICT_OVERFLOW_MISC);
11894           return fold_build2_loc (loc, code, type,
11895                               fold_convert_loc (loc, type,
11896                                                 TREE_OPERAND (arg0, 0)),
11897                               fold_convert_loc (loc, type,
11898                                                 negate_expr (arg1)));
11899         }
11900       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
11901           && TREE_CODE (arg1) == NEGATE_EXPR
11902           && negate_expr_p (arg0))
11903         {
11904           if (INTEGRAL_TYPE_P (type))
11905             fold_overflow_warning (("assuming signed overflow does not occur "
11906                                     "when distributing negation across "
11907                                     "division"),
11908                                    WARN_STRICT_OVERFLOW_MISC);
11909           return fold_build2_loc (loc, code, type,
11910                               fold_convert_loc (loc, type,
11911                                                 negate_expr (arg0)),
11912                               fold_convert_loc (loc, type,
11913                                                 TREE_OPERAND (arg1, 0)));
11914         }
11915
11916       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
11917          operation, EXACT_DIV_EXPR.
11918
11919          Note that only CEIL_DIV_EXPR and FLOOR_DIV_EXPR are rewritten now.
11920          At one time others generated faster code, it's not clear if they do
11921          after the last round to changes to the DIV code in expmed.c.  */
11922       if ((code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR)
11923           && multiple_of_p (type, arg0, arg1))
11924         return fold_build2_loc (loc, EXACT_DIV_EXPR, type, arg0, arg1);
11925
11926       strict_overflow_p = false;
11927       if (TREE_CODE (arg1) == INTEGER_CST
11928           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11929                                          &strict_overflow_p)))
11930         {
11931           if (strict_overflow_p)
11932             fold_overflow_warning (("assuming signed overflow does not occur "
11933                                     "when simplifying division"),
11934                                    WARN_STRICT_OVERFLOW_MISC);
11935           return fold_convert_loc (loc, type, tem);
11936         }
11937
11938       return NULL_TREE;
11939
11940     case CEIL_MOD_EXPR:
11941     case FLOOR_MOD_EXPR:
11942     case ROUND_MOD_EXPR:
11943     case TRUNC_MOD_EXPR:
11944       /* X % -Y is the same as X % Y.  */
11945       if (code == TRUNC_MOD_EXPR
11946           && !TYPE_UNSIGNED (type)
11947           && TREE_CODE (arg1) == NEGATE_EXPR
11948           && !TYPE_OVERFLOW_TRAPS (type))
11949         return fold_build2_loc (loc, code, type, fold_convert_loc (loc, type, arg0),
11950                             fold_convert_loc (loc, type,
11951                                               TREE_OPERAND (arg1, 0)));
11952
11953       strict_overflow_p = false;
11954       if (TREE_CODE (arg1) == INTEGER_CST
11955           && 0 != (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
11956                                          &strict_overflow_p)))
11957         {
11958           if (strict_overflow_p)
11959             fold_overflow_warning (("assuming signed overflow does not occur "
11960                                     "when simplifying modulus"),
11961                                    WARN_STRICT_OVERFLOW_MISC);
11962           return fold_convert_loc (loc, type, tem);
11963         }
11964
11965       /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
11966          i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
11967       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
11968           && (TYPE_UNSIGNED (type)
11969               || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
11970         {
11971           tree c = arg1;
11972           /* Also optimize A % (C << N)  where C is a power of 2,
11973              to A & ((C << N) - 1).  */
11974           if (TREE_CODE (arg1) == LSHIFT_EXPR)
11975             c = TREE_OPERAND (arg1, 0);
11976
11977           if (integer_pow2p (c) && tree_int_cst_sgn (c) > 0)
11978             {
11979               tree mask
11980                 = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (arg1), arg1,
11981                                    build_int_cst (TREE_TYPE (arg1), 1));
11982               if (strict_overflow_p)
11983                 fold_overflow_warning (("assuming signed overflow does not "
11984                                         "occur when simplifying "
11985                                         "X % (power of two)"),
11986                                        WARN_STRICT_OVERFLOW_MISC);
11987               return fold_build2_loc (loc, BIT_AND_EXPR, type,
11988                                       fold_convert_loc (loc, type, arg0),
11989                                       fold_convert_loc (loc, type, mask));
11990             }
11991         }
11992
11993       return NULL_TREE;
11994
11995     case LROTATE_EXPR:
11996     case RROTATE_EXPR:
11997     case RSHIFT_EXPR:
11998     case LSHIFT_EXPR:
11999       /* Since negative shift count is not well-defined,
12000          don't try to compute it in the compiler.  */
12001       if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
12002         return NULL_TREE;
12003
12004       prec = element_precision (type);
12005
12006       /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
12007       if (TREE_CODE (op0) == code && tree_fits_uhwi_p (arg1)
12008           && tree_to_uhwi (arg1) < prec
12009           && tree_fits_uhwi_p (TREE_OPERAND (arg0, 1))
12010           && tree_to_uhwi (TREE_OPERAND (arg0, 1)) < prec)
12011         {
12012           unsigned int low = (tree_to_uhwi (TREE_OPERAND (arg0, 1))
12013                               + tree_to_uhwi (arg1));
12014
12015           /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
12016              being well defined.  */
12017           if (low >= prec)
12018             {
12019               if (code == LROTATE_EXPR || code == RROTATE_EXPR)
12020                 low = low % prec;
12021               else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
12022                 return omit_one_operand_loc (loc, type, build_zero_cst (type),
12023                                          TREE_OPERAND (arg0, 0));
12024               else
12025                 low = prec - 1;
12026             }
12027
12028           return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12029                                   build_int_cst (TREE_TYPE (arg1), low));
12030         }
12031
12032       /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
12033          into x & ((unsigned)-1 >> c) for unsigned types.  */
12034       if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
12035            || (TYPE_UNSIGNED (type)
12036                && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
12037           && tree_fits_uhwi_p (arg1)
12038           && tree_to_uhwi (arg1) < prec
12039           && tree_fits_uhwi_p (TREE_OPERAND (arg0, 1))
12040           && tree_to_uhwi (TREE_OPERAND (arg0, 1)) < prec)
12041         {
12042           HOST_WIDE_INT low0 = tree_to_uhwi (TREE_OPERAND (arg0, 1));
12043           HOST_WIDE_INT low1 = tree_to_uhwi (arg1);
12044           tree lshift;
12045           tree arg00;
12046
12047           if (low0 == low1)
12048             {
12049               arg00 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
12050
12051               lshift = build_minus_one_cst (type);
12052               lshift = const_binop (code, lshift, arg1);
12053
12054               return fold_build2_loc (loc, BIT_AND_EXPR, type, arg00, lshift);
12055             }
12056         }
12057
12058       /* If we have a rotate of a bit operation with the rotate count and
12059          the second operand of the bit operation both constant,
12060          permute the two operations.  */
12061       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
12062           && (TREE_CODE (arg0) == BIT_AND_EXPR
12063               || TREE_CODE (arg0) == BIT_IOR_EXPR
12064               || TREE_CODE (arg0) == BIT_XOR_EXPR)
12065           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12066         return fold_build2_loc (loc, TREE_CODE (arg0), type,
12067                             fold_build2_loc (loc, code, type,
12068                                          TREE_OPERAND (arg0, 0), arg1),
12069                             fold_build2_loc (loc, code, type,
12070                                          TREE_OPERAND (arg0, 1), arg1));
12071
12072       /* Two consecutive rotates adding up to the some integer
12073          multiple of the precision of the type can be ignored.  */
12074       if (code == RROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST
12075           && TREE_CODE (arg0) == RROTATE_EXPR
12076           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12077           && wi::umod_trunc (wi::add (arg1, TREE_OPERAND (arg0, 1)),
12078                              prec) == 0)
12079         return TREE_OPERAND (arg0, 0);
12080
12081       /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
12082               (X & C2) >> C1 into (X >> C1) & (C2 >> C1)
12083          if the latter can be further optimized.  */
12084       if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR)
12085           && TREE_CODE (arg0) == BIT_AND_EXPR
12086           && TREE_CODE (arg1) == INTEGER_CST
12087           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12088         {
12089           tree mask = fold_build2_loc (loc, code, type,
12090                                    fold_convert_loc (loc, type,
12091                                                      TREE_OPERAND (arg0, 1)),
12092                                    arg1);
12093           tree shift = fold_build2_loc (loc, code, type,
12094                                     fold_convert_loc (loc, type,
12095                                                       TREE_OPERAND (arg0, 0)),
12096                                     arg1);
12097           tem = fold_binary_loc (loc, BIT_AND_EXPR, type, shift, mask);
12098           if (tem)
12099             return tem;
12100         }
12101
12102       return NULL_TREE;
12103
12104     case MIN_EXPR:
12105       tem = fold_minmax (loc, MIN_EXPR, type, arg0, arg1);
12106       if (tem)
12107         return tem;
12108       goto associate;
12109
12110     case MAX_EXPR:
12111       tem = fold_minmax (loc, MAX_EXPR, type, arg0, arg1);
12112       if (tem)
12113         return tem;
12114       goto associate;
12115
12116     case TRUTH_ANDIF_EXPR:
12117       /* Note that the operands of this must be ints
12118          and their values must be 0 or 1.
12119          ("true" is a fixed value perhaps depending on the language.)  */
12120       /* If first arg is constant zero, return it.  */
12121       if (integer_zerop (arg0))
12122         return fold_convert_loc (loc, type, arg0);
12123     case TRUTH_AND_EXPR:
12124       /* If either arg is constant true, drop it.  */
12125       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12126         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
12127       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)
12128           /* Preserve sequence points.  */
12129           && (code != TRUTH_ANDIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
12130         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12131       /* If second arg is constant zero, result is zero, but first arg
12132          must be evaluated.  */
12133       if (integer_zerop (arg1))
12134         return omit_one_operand_loc (loc, type, arg1, arg0);
12135       /* Likewise for first arg, but note that only the TRUTH_AND_EXPR
12136          case will be handled here.  */
12137       if (integer_zerop (arg0))
12138         return omit_one_operand_loc (loc, type, arg0, arg1);
12139
12140       /* !X && X is always false.  */
12141       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12142           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12143         return omit_one_operand_loc (loc, type, integer_zero_node, arg1);
12144       /* X && !X is always false.  */
12145       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12146           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12147         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12148
12149       /* A < X && A + 1 > Y ==> A < X && A >= Y.  Normally A + 1 > Y
12150          means A >= Y && A != MAX, but in this case we know that
12151          A < X <= MAX.  */
12152
12153       if (!TREE_SIDE_EFFECTS (arg0)
12154           && !TREE_SIDE_EFFECTS (arg1))
12155         {
12156           tem = fold_to_nonsharp_ineq_using_bound (loc, arg0, arg1);
12157           if (tem && !operand_equal_p (tem, arg0, 0))
12158             return fold_build2_loc (loc, code, type, tem, arg1);
12159
12160           tem = fold_to_nonsharp_ineq_using_bound (loc, arg1, arg0);
12161           if (tem && !operand_equal_p (tem, arg1, 0))
12162             return fold_build2_loc (loc, code, type, arg0, tem);
12163         }
12164
12165       if ((tem = fold_truth_andor (loc, code, type, arg0, arg1, op0, op1))
12166           != NULL_TREE)
12167         return tem;
12168
12169       return NULL_TREE;
12170
12171     case TRUTH_ORIF_EXPR:
12172       /* Note that the operands of this must be ints
12173          and their values must be 0 or true.
12174          ("true" is a fixed value perhaps depending on the language.)  */
12175       /* If first arg is constant true, return it.  */
12176       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12177         return fold_convert_loc (loc, type, arg0);
12178     case TRUTH_OR_EXPR:
12179       /* If either arg is constant zero, drop it.  */
12180       if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0))
12181         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg1));
12182       if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)
12183           /* Preserve sequence points.  */
12184           && (code != TRUTH_ORIF_EXPR || ! TREE_SIDE_EFFECTS (arg0)))
12185         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12186       /* If second arg is constant true, result is true, but we must
12187          evaluate first arg.  */
12188       if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1))
12189         return omit_one_operand_loc (loc, type, arg1, arg0);
12190       /* Likewise for first arg, but note this only occurs here for
12191          TRUTH_OR_EXPR.  */
12192       if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0))
12193         return omit_one_operand_loc (loc, type, arg0, arg1);
12194
12195       /* !X || X is always true.  */
12196       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12197           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12198         return omit_one_operand_loc (loc, type, integer_one_node, arg1);
12199       /* X || !X is always true.  */
12200       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12201           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12202         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
12203
12204       /* (X && !Y) || (!X && Y) is X ^ Y */
12205       if (TREE_CODE (arg0) == TRUTH_AND_EXPR
12206           && TREE_CODE (arg1) == TRUTH_AND_EXPR)
12207         {
12208           tree a0, a1, l0, l1, n0, n1;
12209
12210           a0 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 0));
12211           a1 = fold_convert_loc (loc, type, TREE_OPERAND (arg1, 1));
12212
12213           l0 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
12214           l1 = fold_convert_loc (loc, type, TREE_OPERAND (arg0, 1));
12215           
12216           n0 = fold_build1_loc (loc, TRUTH_NOT_EXPR, type, l0);
12217           n1 = fold_build1_loc (loc, TRUTH_NOT_EXPR, type, l1);
12218           
12219           if ((operand_equal_p (n0, a0, 0)
12220                && operand_equal_p (n1, a1, 0))
12221               || (operand_equal_p (n0, a1, 0)
12222                   && operand_equal_p (n1, a0, 0)))
12223             return fold_build2_loc (loc, TRUTH_XOR_EXPR, type, l0, n1);
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_XOR_EXPR:
12233       /* If the second arg is constant zero, drop it.  */
12234       if (integer_zerop (arg1))
12235         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12236       /* If the second arg is constant true, this is a logical inversion.  */
12237       if (integer_onep (arg1))
12238         {
12239           tem = invert_truthvalue_loc (loc, arg0);
12240           return non_lvalue_loc (loc, fold_convert_loc (loc, type, tem));
12241         }
12242       /* Identical arguments cancel to zero.  */
12243       if (operand_equal_p (arg0, arg1, 0))
12244         return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12245
12246       /* !X ^ X is always true.  */
12247       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
12248           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0))
12249         return omit_one_operand_loc (loc, type, integer_one_node, arg1);
12250
12251       /* X ^ !X is always true.  */
12252       if (TREE_CODE (arg1) == TRUTH_NOT_EXPR
12253           && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
12254         return omit_one_operand_loc (loc, type, integer_one_node, arg0);
12255
12256       return NULL_TREE;
12257
12258     case EQ_EXPR:
12259     case NE_EXPR:
12260       STRIP_NOPS (arg0);
12261       STRIP_NOPS (arg1);
12262
12263       tem = fold_comparison (loc, code, type, op0, op1);
12264       if (tem != NULL_TREE)
12265         return tem;
12266
12267       /* bool_var != 0 becomes bool_var. */
12268       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
12269           && code == NE_EXPR)
12270         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12271
12272       /* bool_var == 1 becomes bool_var. */
12273       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
12274           && code == EQ_EXPR)
12275         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12276
12277       /* bool_var != 1 becomes !bool_var. */
12278       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
12279           && code == NE_EXPR)
12280         return fold_convert_loc (loc, type,
12281                                  fold_build1_loc (loc, TRUTH_NOT_EXPR,
12282                                                   TREE_TYPE (arg0), arg0));
12283
12284       /* bool_var == 0 becomes !bool_var. */
12285       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
12286           && code == EQ_EXPR)
12287         return fold_convert_loc (loc, type,
12288                                  fold_build1_loc (loc, TRUTH_NOT_EXPR,
12289                                                   TREE_TYPE (arg0), arg0));
12290
12291       /* !exp != 0 becomes !exp */
12292       if (TREE_CODE (arg0) == TRUTH_NOT_EXPR && integer_zerop (arg1)
12293           && code == NE_EXPR)
12294         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
12295
12296       /* If this is an equality comparison of the address of two non-weak,
12297          unaliased symbols neither of which are extern (since we do not
12298          have access to attributes for externs), then we know the result.  */
12299       if (TREE_CODE (arg0) == ADDR_EXPR
12300           && DECL_P (TREE_OPERAND (arg0, 0))
12301           && TREE_CODE (arg1) == ADDR_EXPR
12302           && DECL_P (TREE_OPERAND (arg1, 0)))
12303         {
12304           int equal;
12305
12306           if (decl_in_symtab_p (TREE_OPERAND (arg0, 0))
12307               && decl_in_symtab_p (TREE_OPERAND (arg1, 0)))
12308             equal = symtab_node::get_create (TREE_OPERAND (arg0, 0))
12309                     ->equal_address_to (symtab_node::get_create
12310                                           (TREE_OPERAND (arg1, 0)));
12311           else
12312             equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
12313           if (equal != 2)
12314             return constant_boolean_node (equal
12315                                           ? code == EQ_EXPR : code != EQ_EXPR,
12316                                           type);
12317         }
12318
12319       /* Similarly for a NEGATE_EXPR.  */
12320       if (TREE_CODE (arg0) == NEGATE_EXPR
12321           && TREE_CODE (arg1) == INTEGER_CST
12322           && 0 != (tem = negate_expr (fold_convert_loc (loc, TREE_TYPE (arg0),
12323                                                         arg1)))
12324           && TREE_CODE (tem) == INTEGER_CST
12325           && !TREE_OVERFLOW (tem))
12326         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
12327
12328       /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
12329       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12330           && TREE_CODE (arg1) == INTEGER_CST
12331           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12332         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12333                             fold_build2_loc (loc, BIT_XOR_EXPR, TREE_TYPE (arg0),
12334                                          fold_convert_loc (loc,
12335                                                            TREE_TYPE (arg0),
12336                                                            arg1),
12337                                          TREE_OPERAND (arg0, 1)));
12338
12339       /* Transform comparisons of the form X +- Y CMP X to Y CMP 0.  */
12340       if ((TREE_CODE (arg0) == PLUS_EXPR
12341            || TREE_CODE (arg0) == POINTER_PLUS_EXPR
12342            || TREE_CODE (arg0) == MINUS_EXPR)
12343           && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg0,
12344                                                                         0)),
12345                               arg1, 0)
12346           && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
12347               || POINTER_TYPE_P (TREE_TYPE (arg0))))
12348         {
12349           tree val = TREE_OPERAND (arg0, 1);
12350           return omit_two_operands_loc (loc, type,
12351                                     fold_build2_loc (loc, code, type,
12352                                                  val,
12353                                                  build_int_cst (TREE_TYPE (val),
12354                                                                 0)),
12355                                     TREE_OPERAND (arg0, 0), arg1);
12356         }
12357
12358       /* Transform comparisons of the form C - X CMP X if C % 2 == 1.  */
12359       if (TREE_CODE (arg0) == MINUS_EXPR
12360           && TREE_CODE (TREE_OPERAND (arg0, 0)) == INTEGER_CST
12361           && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg0,
12362                                                                         1)),
12363                               arg1, 0)
12364           && wi::extract_uhwi (TREE_OPERAND (arg0, 0), 0, 1) == 1)
12365         {
12366           return omit_two_operands_loc (loc, type,
12367                                     code == NE_EXPR
12368                                     ? boolean_true_node : boolean_false_node,
12369                                     TREE_OPERAND (arg0, 1), arg1);
12370         }
12371
12372       /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
12373       if (TREE_CODE (arg0) == ABS_EXPR
12374           && (integer_zerop (arg1) || real_zerop (arg1)))
12375         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), arg1);
12376
12377       /* If this is an EQ or NE comparison with zero and ARG0 is
12378          (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
12379          two operations, but the latter can be done in one less insn
12380          on machines that have only two-operand insns or on which a
12381          constant cannot be the first operand.  */
12382       if (TREE_CODE (arg0) == BIT_AND_EXPR
12383           && integer_zerop (arg1))
12384         {
12385           tree arg00 = TREE_OPERAND (arg0, 0);
12386           tree arg01 = TREE_OPERAND (arg0, 1);
12387           if (TREE_CODE (arg00) == LSHIFT_EXPR
12388               && integer_onep (TREE_OPERAND (arg00, 0)))
12389             {
12390               tree tem = fold_build2_loc (loc, RSHIFT_EXPR, TREE_TYPE (arg00),
12391                                       arg01, TREE_OPERAND (arg00, 1));
12392               tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), tem,
12393                                  build_int_cst (TREE_TYPE (arg0), 1));
12394               return fold_build2_loc (loc, code, type,
12395                                   fold_convert_loc (loc, TREE_TYPE (arg1), tem),
12396                                   arg1);
12397             }
12398           else if (TREE_CODE (arg01) == LSHIFT_EXPR
12399                    && integer_onep (TREE_OPERAND (arg01, 0)))
12400             {
12401               tree tem = fold_build2_loc (loc, RSHIFT_EXPR, TREE_TYPE (arg01),
12402                                       arg00, TREE_OPERAND (arg01, 1));
12403               tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0), tem,
12404                                  build_int_cst (TREE_TYPE (arg0), 1));
12405               return fold_build2_loc (loc, code, type,
12406                                   fold_convert_loc (loc, TREE_TYPE (arg1), tem),
12407                                   arg1);
12408             }
12409         }
12410
12411       /* If this is an NE or EQ comparison of zero against the result of a
12412          signed MOD operation whose second operand is a power of 2, make
12413          the MOD operation unsigned since it is simpler and equivalent.  */
12414       if (integer_zerop (arg1)
12415           && !TYPE_UNSIGNED (TREE_TYPE (arg0))
12416           && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
12417               || TREE_CODE (arg0) == CEIL_MOD_EXPR
12418               || TREE_CODE (arg0) == FLOOR_MOD_EXPR
12419               || TREE_CODE (arg0) == ROUND_MOD_EXPR)
12420           && integer_pow2p (TREE_OPERAND (arg0, 1)))
12421         {
12422           tree newtype = unsigned_type_for (TREE_TYPE (arg0));
12423           tree newmod = fold_build2_loc (loc, TREE_CODE (arg0), newtype,
12424                                      fold_convert_loc (loc, newtype,
12425                                                        TREE_OPERAND (arg0, 0)),
12426                                      fold_convert_loc (loc, newtype,
12427                                                        TREE_OPERAND (arg0, 1)));
12428
12429           return fold_build2_loc (loc, code, type, newmod,
12430                               fold_convert_loc (loc, newtype, arg1));
12431         }
12432
12433       /* Fold ((X >> C1) & C2) == 0 and ((X >> C1) & C2) != 0 where
12434          C1 is a valid shift constant, and C2 is a power of two, i.e.
12435          a single bit.  */
12436       if (TREE_CODE (arg0) == BIT_AND_EXPR
12437           && TREE_CODE (TREE_OPERAND (arg0, 0)) == RSHIFT_EXPR
12438           && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
12439              == INTEGER_CST
12440           && integer_pow2p (TREE_OPERAND (arg0, 1))
12441           && integer_zerop (arg1))
12442         {
12443           tree itype = TREE_TYPE (arg0);
12444           tree arg001 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
12445           prec = TYPE_PRECISION (itype);
12446
12447           /* Check for a valid shift count.  */
12448           if (wi::ltu_p (arg001, prec))
12449             {
12450               tree arg01 = TREE_OPERAND (arg0, 1);
12451               tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12452               unsigned HOST_WIDE_INT log2 = tree_log2 (arg01);
12453               /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0
12454                  can be rewritten as (X & (C2 << C1)) != 0.  */
12455               if ((log2 + TREE_INT_CST_LOW (arg001)) < prec)
12456                 {
12457                   tem = fold_build2_loc (loc, LSHIFT_EXPR, itype, arg01, arg001);
12458                   tem = fold_build2_loc (loc, BIT_AND_EXPR, itype, arg000, tem);
12459                   return fold_build2_loc (loc, code, type, tem,
12460                                           fold_convert_loc (loc, itype, arg1));
12461                 }
12462               /* Otherwise, for signed (arithmetic) shifts,
12463                  ((X >> C1) & C2) != 0 is rewritten as X < 0, and
12464                  ((X >> C1) & C2) == 0 is rewritten as X >= 0.  */
12465               else if (!TYPE_UNSIGNED (itype))
12466                 return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR, type,
12467                                     arg000, build_int_cst (itype, 0));
12468               /* Otherwise, of unsigned (logical) shifts,
12469                  ((X >> C1) & C2) != 0 is rewritten as (X,false), and
12470                  ((X >> C1) & C2) == 0 is rewritten as (X,true).  */
12471               else
12472                 return omit_one_operand_loc (loc, type,
12473                                          code == EQ_EXPR ? integer_one_node
12474                                                          : integer_zero_node,
12475                                          arg000);
12476             }
12477         }
12478
12479       /* If we have (A & C) == C where C is a power of 2, convert this into
12480          (A & C) != 0.  Similarly for NE_EXPR.  */
12481       if (TREE_CODE (arg0) == BIT_AND_EXPR
12482           && integer_pow2p (TREE_OPERAND (arg0, 1))
12483           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12484         return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12485                             arg0, fold_convert_loc (loc, TREE_TYPE (arg0),
12486                                                     integer_zero_node));
12487
12488       /* If we have (A & C) != 0 or (A & C) == 0 and C is the sign
12489          bit, then fold the expression into A < 0 or A >= 0.  */
12490       tem = fold_single_bit_test_into_sign_test (loc, code, arg0, arg1, type);
12491       if (tem)
12492         return tem;
12493
12494       /* If we have (A & C) == D where D & ~C != 0, convert this into 0.
12495          Similarly for NE_EXPR.  */
12496       if (TREE_CODE (arg0) == BIT_AND_EXPR
12497           && TREE_CODE (arg1) == INTEGER_CST
12498           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12499         {
12500           tree notc = fold_build1_loc (loc, BIT_NOT_EXPR,
12501                                    TREE_TYPE (TREE_OPERAND (arg0, 1)),
12502                                    TREE_OPERAND (arg0, 1));
12503           tree dandnotc
12504             = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12505                                fold_convert_loc (loc, TREE_TYPE (arg0), arg1),
12506                                notc);
12507           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12508           if (integer_nonzerop (dandnotc))
12509             return omit_one_operand_loc (loc, type, rslt, arg0);
12510         }
12511
12512       /* If we have (A | C) == D where C & ~D != 0, convert this into 0.
12513          Similarly for NE_EXPR.  */
12514       if (TREE_CODE (arg0) == BIT_IOR_EXPR
12515           && TREE_CODE (arg1) == INTEGER_CST
12516           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12517         {
12518           tree notd = fold_build1_loc (loc, BIT_NOT_EXPR, TREE_TYPE (arg1), arg1);
12519           tree candnotd
12520             = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12521                                TREE_OPERAND (arg0, 1),
12522                                fold_convert_loc (loc, TREE_TYPE (arg0), notd));
12523           tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
12524           if (integer_nonzerop (candnotd))
12525             return omit_one_operand_loc (loc, type, rslt, arg0);
12526         }
12527
12528       /* If this is a comparison of a field, we may be able to simplify it.  */
12529       if ((TREE_CODE (arg0) == COMPONENT_REF
12530            || TREE_CODE (arg0) == BIT_FIELD_REF)
12531           /* Handle the constant case even without -O
12532              to make sure the warnings are given.  */
12533           && (optimize || TREE_CODE (arg1) == INTEGER_CST))
12534         {
12535           t1 = optimize_bit_field_compare (loc, code, type, arg0, arg1);
12536           if (t1)
12537             return t1;
12538         }
12539
12540       /* Optimize comparisons of strlen vs zero to a compare of the
12541          first character of the string vs zero.  To wit,
12542                 strlen(ptr) == 0   =>  *ptr == 0
12543                 strlen(ptr) != 0   =>  *ptr != 0
12544          Other cases should reduce to one of these two (or a constant)
12545          due to the return value of strlen being unsigned.  */
12546       if (TREE_CODE (arg0) == CALL_EXPR
12547           && integer_zerop (arg1))
12548         {
12549           tree fndecl = get_callee_fndecl (arg0);
12550
12551           if (fndecl
12552               && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
12553               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN
12554               && call_expr_nargs (arg0) == 1
12555               && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE)
12556             {
12557               tree iref = build_fold_indirect_ref_loc (loc,
12558                                                    CALL_EXPR_ARG (arg0, 0));
12559               return fold_build2_loc (loc, code, type, iref,
12560                                   build_int_cst (TREE_TYPE (iref), 0));
12561             }
12562         }
12563
12564       /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
12565          of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
12566       if (TREE_CODE (arg0) == RSHIFT_EXPR
12567           && integer_zerop (arg1)
12568           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12569         {
12570           tree arg00 = TREE_OPERAND (arg0, 0);
12571           tree arg01 = TREE_OPERAND (arg0, 1);
12572           tree itype = TREE_TYPE (arg00);
12573           if (wi::eq_p (arg01, element_precision (itype) - 1))
12574             {
12575               if (TYPE_UNSIGNED (itype))
12576                 {
12577                   itype = signed_type_for (itype);
12578                   arg00 = fold_convert_loc (loc, itype, arg00);
12579                 }
12580               return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR,
12581                                   type, arg00, build_zero_cst (itype));
12582             }
12583         }
12584
12585       /* (X ^ Y) == 0 becomes X == Y, and (X ^ Y) != 0 becomes X != Y.  */
12586       if (integer_zerop (arg1)
12587           && TREE_CODE (arg0) == BIT_XOR_EXPR)
12588         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12589                             TREE_OPERAND (arg0, 1));
12590
12591       /* (X ^ Y) == Y becomes X == 0.  We know that Y has no side-effects.  */
12592       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12593           && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
12594         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12595                                 build_zero_cst (TREE_TYPE (arg0)));
12596       /* Likewise (X ^ Y) == X becomes Y == 0.  X has no side-effects.  */
12597       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12598           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12599           && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
12600         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 1),
12601                                 build_zero_cst (TREE_TYPE (arg0)));
12602
12603       /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2).  */
12604       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12605           && TREE_CODE (arg1) == INTEGER_CST
12606           && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
12607         return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
12608                             fold_build2_loc (loc, BIT_XOR_EXPR, TREE_TYPE (arg1),
12609                                          TREE_OPERAND (arg0, 1), arg1));
12610
12611       /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
12612          (X & C) == 0 when C is a single bit.  */
12613       if (TREE_CODE (arg0) == BIT_AND_EXPR
12614           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_NOT_EXPR
12615           && integer_zerop (arg1)
12616           && integer_pow2p (TREE_OPERAND (arg0, 1)))
12617         {
12618           tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg0),
12619                                  TREE_OPERAND (TREE_OPERAND (arg0, 0), 0),
12620                                  TREE_OPERAND (arg0, 1));
12621           return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR,
12622                                   type, tem,
12623                                   fold_convert_loc (loc, TREE_TYPE (arg0),
12624                                                     arg1));
12625         }
12626
12627       /* Fold ((X & C) ^ C) eq/ne 0 into (X & C) ne/eq 0, when the
12628          constant C is a power of two, i.e. a single bit.  */
12629       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12630           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
12631           && integer_zerop (arg1)
12632           && integer_pow2p (TREE_OPERAND (arg0, 1))
12633           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12634                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12635         {
12636           tree arg00 = TREE_OPERAND (arg0, 0);
12637           return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12638                               arg00, build_int_cst (TREE_TYPE (arg00), 0));
12639         }
12640
12641       /* Likewise, fold ((X ^ C) & C) eq/ne 0 into (X & C) ne/eq 0,
12642          when is C is a power of two, i.e. a single bit.  */
12643       if (TREE_CODE (arg0) == BIT_AND_EXPR
12644           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_XOR_EXPR
12645           && integer_zerop (arg1)
12646           && integer_pow2p (TREE_OPERAND (arg0, 1))
12647           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
12648                               TREE_OPERAND (arg0, 1), OEP_ONLY_CONST))
12649         {
12650           tree arg000 = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
12651           tem = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg000),
12652                              arg000, TREE_OPERAND (arg0, 1));
12653           return fold_build2_loc (loc, code == EQ_EXPR ? NE_EXPR : EQ_EXPR, type,
12654                               tem, build_int_cst (TREE_TYPE (tem), 0));
12655         }
12656
12657       if (integer_zerop (arg1)
12658           && tree_expr_nonzero_p (arg0))
12659         {
12660           tree res = constant_boolean_node (code==NE_EXPR, type);
12661           return omit_one_operand_loc (loc, type, res, arg0);
12662         }
12663
12664       /* Fold -X op -Y as X op Y, where op is eq/ne.  */
12665       if (TREE_CODE (arg0) == NEGATE_EXPR
12666           && TREE_CODE (arg1) == NEGATE_EXPR)
12667         return fold_build2_loc (loc, code, type,
12668                                 TREE_OPERAND (arg0, 0),
12669                                 fold_convert_loc (loc, TREE_TYPE (arg0),
12670                                                   TREE_OPERAND (arg1, 0)));
12671
12672       /* Fold (X & C) op (Y & C) as (X ^ Y) & C op 0", and symmetries.  */
12673       if (TREE_CODE (arg0) == BIT_AND_EXPR
12674           && TREE_CODE (arg1) == BIT_AND_EXPR)
12675         {
12676           tree arg00 = TREE_OPERAND (arg0, 0);
12677           tree arg01 = TREE_OPERAND (arg0, 1);
12678           tree arg10 = TREE_OPERAND (arg1, 0);
12679           tree arg11 = TREE_OPERAND (arg1, 1);
12680           tree itype = TREE_TYPE (arg0);
12681
12682           if (operand_equal_p (arg01, arg11, 0))
12683             return fold_build2_loc (loc, code, type,
12684                                 fold_build2_loc (loc, BIT_AND_EXPR, itype,
12685                                              fold_build2_loc (loc,
12686                                                           BIT_XOR_EXPR, itype,
12687                                                           arg00, arg10),
12688                                              arg01),
12689                                 build_zero_cst (itype));
12690
12691           if (operand_equal_p (arg01, arg10, 0))
12692             return fold_build2_loc (loc, code, type,
12693                                 fold_build2_loc (loc, BIT_AND_EXPR, itype,
12694                                              fold_build2_loc (loc,
12695                                                           BIT_XOR_EXPR, itype,
12696                                                           arg00, arg11),
12697                                              arg01),
12698                                 build_zero_cst (itype));
12699
12700           if (operand_equal_p (arg00, arg11, 0))
12701             return fold_build2_loc (loc, code, type,
12702                                 fold_build2_loc (loc, BIT_AND_EXPR, itype,
12703                                              fold_build2_loc (loc,
12704                                                           BIT_XOR_EXPR, itype,
12705                                                           arg01, arg10),
12706                                              arg00),
12707                                 build_zero_cst (itype));
12708
12709           if (operand_equal_p (arg00, arg10, 0))
12710             return fold_build2_loc (loc, code, type,
12711                                 fold_build2_loc (loc, BIT_AND_EXPR, itype,
12712                                              fold_build2_loc (loc,
12713                                                           BIT_XOR_EXPR, itype,
12714                                                           arg01, arg11),
12715                                              arg00),
12716                                 build_zero_cst (itype));
12717         }
12718
12719       if (TREE_CODE (arg0) == BIT_XOR_EXPR
12720           && TREE_CODE (arg1) == BIT_XOR_EXPR)
12721         {
12722           tree arg00 = TREE_OPERAND (arg0, 0);
12723           tree arg01 = TREE_OPERAND (arg0, 1);
12724           tree arg10 = TREE_OPERAND (arg1, 0);
12725           tree arg11 = TREE_OPERAND (arg1, 1);
12726           tree itype = TREE_TYPE (arg0);
12727
12728           /* Optimize (X ^ Z) op (Y ^ Z) as X op Y, and symmetries.
12729              operand_equal_p guarantees no side-effects so we don't need
12730              to use omit_one_operand on Z.  */
12731           if (operand_equal_p (arg01, arg11, 0))
12732             return fold_build2_loc (loc, code, type, arg00,
12733                                     fold_convert_loc (loc, TREE_TYPE (arg00),
12734                                                       arg10));
12735           if (operand_equal_p (arg01, arg10, 0))
12736             return fold_build2_loc (loc, code, type, arg00,
12737                                     fold_convert_loc (loc, TREE_TYPE (arg00),
12738                                                       arg11));
12739           if (operand_equal_p (arg00, arg11, 0))
12740             return fold_build2_loc (loc, code, type, arg01,
12741                                     fold_convert_loc (loc, TREE_TYPE (arg01),
12742                                                       arg10));
12743           if (operand_equal_p (arg00, arg10, 0))
12744             return fold_build2_loc (loc, code, type, arg01,
12745                                     fold_convert_loc (loc, TREE_TYPE (arg01),
12746                                                       arg11));
12747
12748           /* Optimize (X ^ C1) op (Y ^ C2) as (X ^ (C1 ^ C2)) op Y.  */
12749           if (TREE_CODE (arg01) == INTEGER_CST
12750               && TREE_CODE (arg11) == INTEGER_CST)
12751             {
12752               tem = fold_build2_loc (loc, BIT_XOR_EXPR, itype, arg01,
12753                                      fold_convert_loc (loc, itype, arg11));
12754               tem = fold_build2_loc (loc, BIT_XOR_EXPR, itype, arg00, tem);
12755               return fold_build2_loc (loc, code, type, tem,
12756                                       fold_convert_loc (loc, itype, arg10));
12757             }
12758         }
12759
12760       /* Attempt to simplify equality/inequality comparisons of complex
12761          values.  Only lower the comparison if the result is known or
12762          can be simplified to a single scalar comparison.  */
12763       if ((TREE_CODE (arg0) == COMPLEX_EXPR
12764            || TREE_CODE (arg0) == COMPLEX_CST)
12765           && (TREE_CODE (arg1) == COMPLEX_EXPR
12766               || TREE_CODE (arg1) == COMPLEX_CST))
12767         {
12768           tree real0, imag0, real1, imag1;
12769           tree rcond, icond;
12770
12771           if (TREE_CODE (arg0) == COMPLEX_EXPR)
12772             {
12773               real0 = TREE_OPERAND (arg0, 0);
12774               imag0 = TREE_OPERAND (arg0, 1);
12775             }
12776           else
12777             {
12778               real0 = TREE_REALPART (arg0);
12779               imag0 = TREE_IMAGPART (arg0);
12780             }
12781
12782           if (TREE_CODE (arg1) == COMPLEX_EXPR)
12783             {
12784               real1 = TREE_OPERAND (arg1, 0);
12785               imag1 = TREE_OPERAND (arg1, 1);
12786             }
12787           else
12788             {
12789               real1 = TREE_REALPART (arg1);
12790               imag1 = TREE_IMAGPART (arg1);
12791             }
12792
12793           rcond = fold_binary_loc (loc, code, type, real0, real1);
12794           if (rcond && TREE_CODE (rcond) == INTEGER_CST)
12795             {
12796               if (integer_zerop (rcond))
12797                 {
12798                   if (code == EQ_EXPR)
12799                     return omit_two_operands_loc (loc, type, boolean_false_node,
12800                                               imag0, imag1);
12801                   return fold_build2_loc (loc, NE_EXPR, type, imag0, imag1);
12802                 }
12803               else
12804                 {
12805                   if (code == NE_EXPR)
12806                     return omit_two_operands_loc (loc, type, boolean_true_node,
12807                                               imag0, imag1);
12808                   return fold_build2_loc (loc, EQ_EXPR, type, imag0, imag1);
12809                 }
12810             }
12811
12812           icond = fold_binary_loc (loc, code, type, imag0, imag1);
12813           if (icond && TREE_CODE (icond) == INTEGER_CST)
12814             {
12815               if (integer_zerop (icond))
12816                 {
12817                   if (code == EQ_EXPR)
12818                     return omit_two_operands_loc (loc, type, boolean_false_node,
12819                                               real0, real1);
12820                   return fold_build2_loc (loc, NE_EXPR, type, real0, real1);
12821                 }
12822               else
12823                 {
12824                   if (code == NE_EXPR)
12825                     return omit_two_operands_loc (loc, type, boolean_true_node,
12826                                               real0, real1);
12827                   return fold_build2_loc (loc, EQ_EXPR, type, real0, real1);
12828                 }
12829             }
12830         }
12831
12832       return NULL_TREE;
12833
12834     case LT_EXPR:
12835     case GT_EXPR:
12836     case LE_EXPR:
12837     case GE_EXPR:
12838       tem = fold_comparison (loc, code, type, op0, op1);
12839       if (tem != NULL_TREE)
12840         return tem;
12841
12842       /* Transform comparisons of the form X +- C CMP X.  */
12843       if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
12844           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
12845           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
12846                && !HONOR_SNANS (arg0))
12847               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
12848                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
12849         {
12850           tree arg01 = TREE_OPERAND (arg0, 1);
12851           enum tree_code code0 = TREE_CODE (arg0);
12852           int is_positive;
12853
12854           if (TREE_CODE (arg01) == REAL_CST)
12855             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 : 1;
12856           else
12857             is_positive = tree_int_cst_sgn (arg01);
12858
12859           /* (X - c) > X becomes false.  */
12860           if (code == GT_EXPR
12861               && ((code0 == MINUS_EXPR && is_positive >= 0)
12862                   || (code0 == PLUS_EXPR && is_positive <= 0)))
12863             {
12864               if (TREE_CODE (arg01) == INTEGER_CST
12865                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12866                 fold_overflow_warning (("assuming signed overflow does not "
12867                                         "occur when assuming that (X - c) > X "
12868                                         "is always false"),
12869                                        WARN_STRICT_OVERFLOW_ALL);
12870               return constant_boolean_node (0, type);
12871             }
12872
12873           /* Likewise (X + c) < X becomes false.  */
12874           if (code == LT_EXPR
12875               && ((code0 == PLUS_EXPR && is_positive >= 0)
12876                   || (code0 == MINUS_EXPR && is_positive <= 0)))
12877             {
12878               if (TREE_CODE (arg01) == INTEGER_CST
12879                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12880                 fold_overflow_warning (("assuming signed overflow does not "
12881                                         "occur when assuming that "
12882                                         "(X + c) < X is always false"),
12883                                        WARN_STRICT_OVERFLOW_ALL);
12884               return constant_boolean_node (0, type);
12885             }
12886
12887           /* Convert (X - c) <= X to true.  */
12888           if (!HONOR_NANS (arg1)
12889               && code == LE_EXPR
12890               && ((code0 == MINUS_EXPR && is_positive >= 0)
12891                   || (code0 == PLUS_EXPR && is_positive <= 0)))
12892             {
12893               if (TREE_CODE (arg01) == INTEGER_CST
12894                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12895                 fold_overflow_warning (("assuming signed overflow does not "
12896                                         "occur when assuming that "
12897                                         "(X - c) <= X is always true"),
12898                                        WARN_STRICT_OVERFLOW_ALL);
12899               return constant_boolean_node (1, type);
12900             }
12901
12902           /* Convert (X + c) >= X to true.  */
12903           if (!HONOR_NANS (arg1)
12904               && code == GE_EXPR
12905               && ((code0 == PLUS_EXPR && is_positive >= 0)
12906                   || (code0 == MINUS_EXPR && is_positive <= 0)))
12907             {
12908               if (TREE_CODE (arg01) == INTEGER_CST
12909                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12910                 fold_overflow_warning (("assuming signed overflow does not "
12911                                         "occur when assuming that "
12912                                         "(X + c) >= X is always true"),
12913                                        WARN_STRICT_OVERFLOW_ALL);
12914               return constant_boolean_node (1, type);
12915             }
12916
12917           if (TREE_CODE (arg01) == INTEGER_CST)
12918             {
12919               /* Convert X + c > X and X - c < X to true for integers.  */
12920               if (code == GT_EXPR
12921                   && ((code0 == PLUS_EXPR && is_positive > 0)
12922                       || (code0 == MINUS_EXPR && is_positive < 0)))
12923                 {
12924                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12925                     fold_overflow_warning (("assuming signed overflow does "
12926                                             "not occur when assuming that "
12927                                             "(X + c) > X is always true"),
12928                                            WARN_STRICT_OVERFLOW_ALL);
12929                   return constant_boolean_node (1, type);
12930                 }
12931
12932               if (code == LT_EXPR
12933                   && ((code0 == MINUS_EXPR && is_positive > 0)
12934                       || (code0 == PLUS_EXPR && is_positive < 0)))
12935                 {
12936                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12937                     fold_overflow_warning (("assuming signed overflow does "
12938                                             "not occur when assuming that "
12939                                             "(X - c) < X is always true"),
12940                                            WARN_STRICT_OVERFLOW_ALL);
12941                   return constant_boolean_node (1, type);
12942                 }
12943
12944               /* Convert X + c <= X and X - c >= X to false for integers.  */
12945               if (code == LE_EXPR
12946                   && ((code0 == PLUS_EXPR && is_positive > 0)
12947                       || (code0 == MINUS_EXPR && is_positive < 0)))
12948                 {
12949                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12950                     fold_overflow_warning (("assuming signed overflow does "
12951                                             "not occur when assuming that "
12952                                             "(X + c) <= X is always false"),
12953                                            WARN_STRICT_OVERFLOW_ALL);
12954                   return constant_boolean_node (0, type);
12955                 }
12956
12957               if (code == GE_EXPR
12958                   && ((code0 == MINUS_EXPR && is_positive > 0)
12959                       || (code0 == PLUS_EXPR && is_positive < 0)))
12960                 {
12961                   if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))
12962                     fold_overflow_warning (("assuming signed overflow does "
12963                                             "not occur when assuming that "
12964                                             "(X - c) >= X is always false"),
12965                                            WARN_STRICT_OVERFLOW_ALL);
12966                   return constant_boolean_node (0, type);
12967                 }
12968             }
12969         }
12970
12971       /* Comparisons with the highest or lowest possible integer of
12972          the specified precision will have known values.  */
12973       {
12974         tree arg1_type = TREE_TYPE (arg1);
12975         unsigned int prec = TYPE_PRECISION (arg1_type);
12976
12977         if (TREE_CODE (arg1) == INTEGER_CST
12978             && (INTEGRAL_TYPE_P (arg1_type) || POINTER_TYPE_P (arg1_type)))
12979           {
12980             wide_int max = wi::max_value (arg1_type);
12981             wide_int signed_max = wi::max_value (prec, SIGNED);
12982             wide_int min = wi::min_value (arg1_type);
12983
12984             if (wi::eq_p (arg1, max))
12985               switch (code)
12986                 {
12987                 case GT_EXPR:
12988                   return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
12989
12990                 case GE_EXPR:
12991                   return fold_build2_loc (loc, EQ_EXPR, type, op0, op1);
12992
12993                 case LE_EXPR:
12994                   return omit_one_operand_loc (loc, type, integer_one_node, arg0);
12995
12996                 case LT_EXPR:
12997                   return fold_build2_loc (loc, NE_EXPR, type, op0, op1);
12998
12999                 /* The GE_EXPR and LT_EXPR cases above are not normally
13000                    reached because of previous transformations.  */
13001
13002                 default:
13003                   break;
13004                 }
13005             else if (wi::eq_p (arg1, max - 1))
13006               switch (code)
13007                 {
13008                 case GT_EXPR:
13009                   arg1 = const_binop (PLUS_EXPR, arg1,
13010                                       build_int_cst (TREE_TYPE (arg1), 1));
13011                   return fold_build2_loc (loc, EQ_EXPR, type,
13012                                       fold_convert_loc (loc,
13013                                                         TREE_TYPE (arg1), arg0),
13014                                       arg1);
13015                 case LE_EXPR:
13016                   arg1 = const_binop (PLUS_EXPR, arg1,
13017                                       build_int_cst (TREE_TYPE (arg1), 1));
13018                   return fold_build2_loc (loc, NE_EXPR, type,
13019                                       fold_convert_loc (loc, TREE_TYPE (arg1),
13020                                                         arg0),
13021                                       arg1);
13022                 default:
13023                   break;
13024                 }
13025             else if (wi::eq_p (arg1, min))
13026               switch (code)
13027                 {
13028                 case LT_EXPR:
13029                   return omit_one_operand_loc (loc, type, integer_zero_node, arg0);
13030
13031                 case LE_EXPR:
13032                   return fold_build2_loc (loc, EQ_EXPR, type, op0, op1);
13033
13034                 case GE_EXPR:
13035                   return omit_one_operand_loc (loc, type, integer_one_node, arg0);
13036
13037                 case GT_EXPR:
13038                   return fold_build2_loc (loc, NE_EXPR, type, op0, op1);
13039
13040                 default:
13041                   break;
13042                 }
13043             else if (wi::eq_p (arg1, min + 1))
13044               switch (code)
13045                 {
13046                 case GE_EXPR:
13047                   arg1 = const_binop (MINUS_EXPR, arg1,
13048                                       build_int_cst (TREE_TYPE (arg1), 1));
13049                   return fold_build2_loc (loc, NE_EXPR, type,
13050                                       fold_convert_loc (loc,
13051                                                         TREE_TYPE (arg1), arg0),
13052                                       arg1);
13053                 case LT_EXPR:
13054                   arg1 = const_binop (MINUS_EXPR, arg1,
13055                                       build_int_cst (TREE_TYPE (arg1), 1));
13056                   return fold_build2_loc (loc, EQ_EXPR, type,
13057                                       fold_convert_loc (loc, TREE_TYPE (arg1),
13058                                                         arg0),
13059                                       arg1);
13060                 default:
13061                   break;
13062                 }
13063
13064             else if (wi::eq_p (arg1, signed_max)
13065                      && TYPE_UNSIGNED (arg1_type)
13066                      /* We will flip the signedness of the comparison operator
13067                         associated with the mode of arg1, so the sign bit is
13068                         specified by this mode.  Check that arg1 is the signed
13069                         max associated with this sign bit.  */
13070                      && prec == GET_MODE_PRECISION (TYPE_MODE (arg1_type))
13071                      /* signed_type does not work on pointer types.  */
13072                      && INTEGRAL_TYPE_P (arg1_type))
13073               {
13074                 /* The following case also applies to X < signed_max+1
13075                    and X >= signed_max+1 because previous transformations.  */
13076                 if (code == LE_EXPR || code == GT_EXPR)
13077                   {
13078                     tree st = signed_type_for (arg1_type);
13079                     return fold_build2_loc (loc,
13080                                         code == LE_EXPR ? GE_EXPR : LT_EXPR,
13081                                         type, fold_convert_loc (loc, st, arg0),
13082                                         build_int_cst (st, 0));
13083                   }
13084               }
13085           }
13086       }
13087
13088       /* If we are comparing an ABS_EXPR with a constant, we can
13089          convert all the cases into explicit comparisons, but they may
13090          well not be faster than doing the ABS and one comparison.
13091          But ABS (X) <= C is a range comparison, which becomes a subtraction
13092          and a comparison, and is probably faster.  */
13093       if (code == LE_EXPR
13094           && TREE_CODE (arg1) == INTEGER_CST
13095           && TREE_CODE (arg0) == ABS_EXPR
13096           && ! TREE_SIDE_EFFECTS (arg0)
13097           && (0 != (tem = negate_expr (arg1)))
13098           && TREE_CODE (tem) == INTEGER_CST
13099           && !TREE_OVERFLOW (tem))
13100         return fold_build2_loc (loc, TRUTH_ANDIF_EXPR, type,
13101                             build2 (GE_EXPR, type,
13102                                     TREE_OPERAND (arg0, 0), tem),
13103                             build2 (LE_EXPR, type,
13104                                     TREE_OPERAND (arg0, 0), arg1));
13105
13106       /* Convert ABS_EXPR<x> >= 0 to true.  */
13107       strict_overflow_p = false;
13108       if (code == GE_EXPR
13109           && (integer_zerop (arg1)
13110               || (! HONOR_NANS (arg0)
13111                   && real_zerop (arg1)))
13112           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
13113         {
13114           if (strict_overflow_p)
13115             fold_overflow_warning (("assuming signed overflow does not occur "
13116                                     "when simplifying comparison of "
13117                                     "absolute value and zero"),
13118                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
13119           return omit_one_operand_loc (loc, type,
13120                                        constant_boolean_node (true, type),
13121                                        arg0);
13122         }
13123
13124       /* Convert ABS_EXPR<x> < 0 to false.  */
13125       strict_overflow_p = false;
13126       if (code == LT_EXPR
13127           && (integer_zerop (arg1) || real_zerop (arg1))
13128           && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
13129         {
13130           if (strict_overflow_p)
13131             fold_overflow_warning (("assuming signed overflow does not occur "
13132                                     "when simplifying comparison of "
13133                                     "absolute value and zero"),
13134                                    WARN_STRICT_OVERFLOW_CONDITIONAL);
13135           return omit_one_operand_loc (loc, type,
13136                                        constant_boolean_node (false, type),
13137                                        arg0);
13138         }
13139
13140       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
13141          and similarly for >= into !=.  */
13142       if ((code == LT_EXPR || code == GE_EXPR)
13143           && TYPE_UNSIGNED (TREE_TYPE (arg0))
13144           && TREE_CODE (arg1) == LSHIFT_EXPR
13145           && integer_onep (TREE_OPERAND (arg1, 0)))
13146         return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
13147                            build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
13148                                    TREE_OPERAND (arg1, 1)),
13149                            build_zero_cst (TREE_TYPE (arg0)));
13150
13151       /* Similarly for X < (cast) (1 << Y).  But cast can't be narrowing,
13152          otherwise Y might be >= # of bits in X's type and thus e.g.
13153          (unsigned char) (1 << Y) for Y 15 might be 0.
13154          If the cast is widening, then 1 << Y should have unsigned type,
13155          otherwise if Y is number of bits in the signed shift type minus 1,
13156          we can't optimize this.  E.g. (unsigned long long) (1 << Y) for Y
13157          31 might be 0xffffffff80000000.  */
13158       if ((code == LT_EXPR || code == GE_EXPR)
13159           && TYPE_UNSIGNED (TREE_TYPE (arg0))
13160           && CONVERT_EXPR_P (arg1)
13161           && TREE_CODE (TREE_OPERAND (arg1, 0)) == LSHIFT_EXPR
13162           && (element_precision (TREE_TYPE (arg1))
13163               >= element_precision (TREE_TYPE (TREE_OPERAND (arg1, 0))))
13164           && (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg1, 0)))
13165               || (element_precision (TREE_TYPE (arg1))
13166                   == element_precision (TREE_TYPE (TREE_OPERAND (arg1, 0)))))
13167           && integer_onep (TREE_OPERAND (TREE_OPERAND (arg1, 0), 0)))
13168         {
13169           tem = build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
13170                         TREE_OPERAND (TREE_OPERAND (arg1, 0), 1));
13171           return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
13172                              fold_convert_loc (loc, TREE_TYPE (arg0), tem),
13173                              build_zero_cst (TREE_TYPE (arg0)));
13174         }
13175
13176       return NULL_TREE;
13177
13178     case UNORDERED_EXPR:
13179     case ORDERED_EXPR:
13180     case UNLT_EXPR:
13181     case UNLE_EXPR:
13182     case UNGT_EXPR:
13183     case UNGE_EXPR:
13184     case UNEQ_EXPR:
13185     case LTGT_EXPR:
13186       if (TREE_CODE (arg0) == REAL_CST && TREE_CODE (arg1) == REAL_CST)
13187         {
13188           t1 = fold_relational_const (code, type, arg0, arg1);
13189           if (t1 != NULL_TREE)
13190             return t1;
13191         }
13192
13193       /* If the first operand is NaN, the result is constant.  */
13194       if (TREE_CODE (arg0) == REAL_CST
13195           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg0))
13196           && (code != LTGT_EXPR || ! flag_trapping_math))
13197         {
13198           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
13199                ? integer_zero_node
13200                : integer_one_node;
13201           return omit_one_operand_loc (loc, type, t1, arg1);
13202         }
13203
13204       /* If the second operand is NaN, the result is constant.  */
13205       if (TREE_CODE (arg1) == REAL_CST
13206           && REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))
13207           && (code != LTGT_EXPR || ! flag_trapping_math))
13208         {
13209           t1 = (code == ORDERED_EXPR || code == LTGT_EXPR)
13210                ? integer_zero_node
13211                : integer_one_node;
13212           return omit_one_operand_loc (loc, type, t1, arg0);
13213         }
13214
13215       /* Simplify unordered comparison of something with itself.  */
13216       if ((code == UNLE_EXPR || code == UNGE_EXPR || code == UNEQ_EXPR)
13217           && operand_equal_p (arg0, arg1, 0))
13218         return constant_boolean_node (1, type);
13219
13220       if (code == LTGT_EXPR
13221           && !flag_trapping_math
13222           && operand_equal_p (arg0, arg1, 0))
13223         return constant_boolean_node (0, type);
13224
13225       /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
13226       {
13227         tree targ0 = strip_float_extensions (arg0);
13228         tree targ1 = strip_float_extensions (arg1);
13229         tree newtype = TREE_TYPE (targ0);
13230
13231         if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
13232           newtype = TREE_TYPE (targ1);
13233
13234         if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
13235           return fold_build2_loc (loc, code, type,
13236                               fold_convert_loc (loc, newtype, targ0),
13237                               fold_convert_loc (loc, newtype, targ1));
13238       }
13239
13240       return NULL_TREE;
13241
13242     case COMPOUND_EXPR:
13243       /* When pedantic, a compound expression can be neither an lvalue
13244          nor an integer constant expression.  */
13245       if (TREE_SIDE_EFFECTS (arg0) || TREE_CONSTANT (arg1))
13246         return NULL_TREE;
13247       /* Don't let (0, 0) be null pointer constant.  */
13248       tem = integer_zerop (arg1) ? build1 (NOP_EXPR, type, arg1)
13249                                  : fold_convert_loc (loc, type, arg1);
13250       return pedantic_non_lvalue_loc (loc, tem);
13251
13252     case ASSERT_EXPR:
13253       /* An ASSERT_EXPR should never be passed to fold_binary.  */
13254       gcc_unreachable ();
13255
13256     default:
13257       return NULL_TREE;
13258     } /* switch (code) */
13259 }
13260
13261 /* Callback for walk_tree, looking for LABEL_EXPR.  Return *TP if it is
13262    a LABEL_EXPR; otherwise return NULL_TREE.  Do not check the subtrees
13263    of GOTO_EXPR.  */
13264
13265 static tree
13266 contains_label_1 (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
13267 {
13268   switch (TREE_CODE (*tp))
13269     {
13270     case LABEL_EXPR:
13271       return *tp;
13272
13273     case GOTO_EXPR:
13274       *walk_subtrees = 0;
13275
13276       /* ... fall through ...  */
13277
13278     default:
13279       return NULL_TREE;
13280     }
13281 }
13282
13283 /* Return whether the sub-tree ST contains a label which is accessible from
13284    outside the sub-tree.  */
13285
13286 static bool
13287 contains_label_p (tree st)
13288 {
13289   return
13290    (walk_tree_without_duplicates (&st, contains_label_1 , NULL) != NULL_TREE);
13291 }
13292
13293 /* Fold a ternary expression of code CODE and type TYPE with operands
13294    OP0, OP1, and OP2.  Return the folded expression if folding is
13295    successful.  Otherwise, return NULL_TREE.  */
13296
13297 tree
13298 fold_ternary_loc (location_t loc, enum tree_code code, tree type,
13299                   tree op0, tree op1, tree op2)
13300 {
13301   tree tem;
13302   tree arg0 = NULL_TREE, arg1 = NULL_TREE, arg2 = NULL_TREE;
13303   enum tree_code_class kind = TREE_CODE_CLASS (code);
13304
13305   gcc_assert (IS_EXPR_CODE_CLASS (kind)
13306               && TREE_CODE_LENGTH (code) == 3);
13307
13308   /* If this is a commutative operation, and OP0 is a constant, move it
13309      to OP1 to reduce the number of tests below.  */
13310   if (commutative_ternary_tree_code (code)
13311       && tree_swap_operands_p (op0, op1, true))
13312     return fold_build3_loc (loc, code, type, op1, op0, op2);
13313
13314   tem = generic_simplify (loc, code, type, op0, op1, op2);
13315   if (tem)
13316     return tem;
13317
13318   /* Strip any conversions that don't change the mode.  This is safe
13319      for every expression, except for a comparison expression because
13320      its signedness is derived from its operands.  So, in the latter
13321      case, only strip conversions that don't change the signedness.
13322
13323      Note that this is done as an internal manipulation within the
13324      constant folder, in order to find the simplest representation of
13325      the arguments so that their form can be studied.  In any cases,
13326      the appropriate type conversions should be put back in the tree
13327      that will get out of the constant folder.  */
13328   if (op0)
13329     {
13330       arg0 = op0;
13331       STRIP_NOPS (arg0);
13332     }
13333
13334   if (op1)
13335     {
13336       arg1 = op1;
13337       STRIP_NOPS (arg1);
13338     }
13339
13340   if (op2)
13341     {
13342       arg2 = op2;
13343       STRIP_NOPS (arg2);
13344     }
13345
13346   switch (code)
13347     {
13348     case COMPONENT_REF:
13349       if (TREE_CODE (arg0) == CONSTRUCTOR
13350           && ! type_contains_placeholder_p (TREE_TYPE (arg0)))
13351         {
13352           unsigned HOST_WIDE_INT idx;
13353           tree field, value;
13354           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (arg0), idx, field, value)
13355             if (field == arg1)
13356               return value;
13357         }
13358       return NULL_TREE;
13359
13360     case COND_EXPR:
13361     case VEC_COND_EXPR:
13362       /* Pedantic ANSI C says that a conditional expression is never an lvalue,
13363          so all simple results must be passed through pedantic_non_lvalue.  */
13364       if (TREE_CODE (arg0) == INTEGER_CST)
13365         {
13366           tree unused_op = integer_zerop (arg0) ? op1 : op2;
13367           tem = integer_zerop (arg0) ? op2 : op1;
13368           /* Only optimize constant conditions when the selected branch
13369              has the same type as the COND_EXPR.  This avoids optimizing
13370              away "c ? x : throw", where the throw has a void type.
13371              Avoid throwing away that operand which contains label.  */
13372           if ((!TREE_SIDE_EFFECTS (unused_op)
13373                || !contains_label_p (unused_op))
13374               && (! VOID_TYPE_P (TREE_TYPE (tem))
13375                   || VOID_TYPE_P (type)))
13376             return pedantic_non_lvalue_loc (loc, tem);
13377           return NULL_TREE;
13378         }
13379       else if (TREE_CODE (arg0) == VECTOR_CST)
13380         {
13381           if ((TREE_CODE (arg1) == VECTOR_CST
13382                || TREE_CODE (arg1) == CONSTRUCTOR)
13383               && (TREE_CODE (arg2) == VECTOR_CST
13384                   || TREE_CODE (arg2) == CONSTRUCTOR))
13385             {
13386               unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
13387               unsigned char *sel = XALLOCAVEC (unsigned char, nelts);
13388               gcc_assert (nelts == VECTOR_CST_NELTS (arg0));
13389               for (i = 0; i < nelts; i++)
13390                 {
13391                   tree val = VECTOR_CST_ELT (arg0, i);
13392                   if (integer_all_onesp (val))
13393                     sel[i] = i;
13394                   else if (integer_zerop (val))
13395                     sel[i] = nelts + i;
13396                   else /* Currently unreachable.  */
13397                     return NULL_TREE;
13398                 }
13399               tree t = fold_vec_perm (type, arg1, arg2, sel);
13400               if (t != NULL_TREE)
13401                 return t;
13402             }
13403         }
13404
13405       /* If we have A op B ? A : C, we may be able to convert this to a
13406          simpler expression, depending on the operation and the values
13407          of B and C.  Signed zeros prevent all of these transformations,
13408          for reasons given above each one.
13409
13410          Also try swapping the arguments and inverting the conditional.  */
13411       if (COMPARISON_CLASS_P (arg0)
13412           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
13413                                              arg1, TREE_OPERAND (arg0, 1))
13414           && !HONOR_SIGNED_ZEROS (element_mode (arg1)))
13415         {
13416           tem = fold_cond_expr_with_comparison (loc, type, arg0, op1, op2);
13417           if (tem)
13418             return tem;
13419         }
13420
13421       if (COMPARISON_CLASS_P (arg0)
13422           && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
13423                                              op2,
13424                                              TREE_OPERAND (arg0, 1))
13425           && !HONOR_SIGNED_ZEROS (element_mode (op2)))
13426         {
13427           location_t loc0 = expr_location_or (arg0, loc);
13428           tem = fold_invert_truthvalue (loc0, arg0);
13429           if (tem && COMPARISON_CLASS_P (tem))
13430             {
13431               tem = fold_cond_expr_with_comparison (loc, type, tem, op2, op1);
13432               if (tem)
13433                 return tem;
13434             }
13435         }
13436
13437       /* If the second operand is simpler than the third, swap them
13438          since that produces better jump optimization results.  */
13439       if (truth_value_p (TREE_CODE (arg0))
13440           && tree_swap_operands_p (op1, op2, false))
13441         {
13442           location_t loc0 = expr_location_or (arg0, loc);
13443           /* See if this can be inverted.  If it can't, possibly because
13444              it was a floating-point inequality comparison, don't do
13445              anything.  */
13446           tem = fold_invert_truthvalue (loc0, arg0);
13447           if (tem)
13448             return fold_build3_loc (loc, code, type, tem, op2, op1);
13449         }
13450
13451       /* Convert A ? 1 : 0 to simply A.  */
13452       if ((code == VEC_COND_EXPR ? integer_all_onesp (op1)
13453                                  : (integer_onep (op1)
13454                                     && !VECTOR_TYPE_P (type)))
13455           && integer_zerop (op2)
13456           /* If we try to convert OP0 to our type, the
13457              call to fold will try to move the conversion inside
13458              a COND, which will recurse.  In that case, the COND_EXPR
13459              is probably the best choice, so leave it alone.  */
13460           && type == TREE_TYPE (arg0))
13461         return pedantic_non_lvalue_loc (loc, arg0);
13462
13463       /* Convert A ? 0 : 1 to !A.  This prefers the use of NOT_EXPR
13464          over COND_EXPR in cases such as floating point comparisons.  */
13465       if (integer_zerop (op1)
13466           && (code == VEC_COND_EXPR ? integer_all_onesp (op2)
13467                                     : (integer_onep (op2)
13468                                        && !VECTOR_TYPE_P (type)))
13469           && truth_value_p (TREE_CODE (arg0)))
13470         return pedantic_non_lvalue_loc (loc,
13471                                     fold_convert_loc (loc, type,
13472                                               invert_truthvalue_loc (loc,
13473                                                                      arg0)));
13474
13475       /* A < 0 ? <sign bit of A> : 0 is simply (A & <sign bit of A>).  */
13476       if (TREE_CODE (arg0) == LT_EXPR
13477           && integer_zerop (TREE_OPERAND (arg0, 1))
13478           && integer_zerop (op2)
13479           && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
13480         {
13481           /* sign_bit_p looks through both zero and sign extensions,
13482              but for this optimization only sign extensions are
13483              usable.  */
13484           tree tem2 = TREE_OPERAND (arg0, 0);
13485           while (tem != tem2)
13486             {
13487               if (TREE_CODE (tem2) != NOP_EXPR
13488                   || TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (tem2, 0))))
13489                 {
13490                   tem = NULL_TREE;
13491                   break;
13492                 }
13493               tem2 = TREE_OPERAND (tem2, 0);
13494             }
13495           /* sign_bit_p only checks ARG1 bits within A's precision.
13496              If <sign bit of A> has wider type than A, bits outside
13497              of A's precision in <sign bit of A> need to be checked.
13498              If they are all 0, this optimization needs to be done
13499              in unsigned A's type, if they are all 1 in signed A's type,
13500              otherwise this can't be done.  */
13501           if (tem
13502               && TYPE_PRECISION (TREE_TYPE (tem))
13503                  < TYPE_PRECISION (TREE_TYPE (arg1))
13504               && TYPE_PRECISION (TREE_TYPE (tem))
13505                  < TYPE_PRECISION (type))
13506             {
13507               int inner_width, outer_width;
13508               tree tem_type;
13509
13510               inner_width = TYPE_PRECISION (TREE_TYPE (tem));
13511               outer_width = TYPE_PRECISION (TREE_TYPE (arg1));
13512               if (outer_width > TYPE_PRECISION (type))
13513                 outer_width = TYPE_PRECISION (type);
13514
13515               wide_int mask = wi::shifted_mask
13516                 (inner_width, outer_width - inner_width, false,
13517                  TYPE_PRECISION (TREE_TYPE (arg1)));
13518
13519               wide_int common = mask & arg1;
13520               if (common == mask)
13521                 {
13522                   tem_type = signed_type_for (TREE_TYPE (tem));
13523                   tem = fold_convert_loc (loc, tem_type, tem);
13524                 }
13525               else if (common == 0)
13526                 {
13527                   tem_type = unsigned_type_for (TREE_TYPE (tem));
13528                   tem = fold_convert_loc (loc, tem_type, tem);
13529                 }
13530               else
13531                 tem = NULL;
13532             }
13533
13534           if (tem)
13535             return
13536               fold_convert_loc (loc, type,
13537                                 fold_build2_loc (loc, BIT_AND_EXPR,
13538                                              TREE_TYPE (tem), tem,
13539                                              fold_convert_loc (loc,
13540                                                                TREE_TYPE (tem),
13541                                                                arg1)));
13542         }
13543
13544       /* (A >> N) & 1 ? (1 << N) : 0 is simply A & (1 << N).  A & 1 was
13545          already handled above.  */
13546       if (TREE_CODE (arg0) == BIT_AND_EXPR
13547           && integer_onep (TREE_OPERAND (arg0, 1))
13548           && integer_zerop (op2)
13549           && integer_pow2p (arg1))
13550         {
13551           tree tem = TREE_OPERAND (arg0, 0);
13552           STRIP_NOPS (tem);
13553           if (TREE_CODE (tem) == RSHIFT_EXPR
13554               && tree_fits_uhwi_p (TREE_OPERAND (tem, 1))
13555               && (unsigned HOST_WIDE_INT) tree_log2 (arg1) ==
13556                  tree_to_uhwi (TREE_OPERAND (tem, 1)))
13557             return fold_build2_loc (loc, BIT_AND_EXPR, type,
13558                                 TREE_OPERAND (tem, 0), arg1);
13559         }
13560
13561       /* A & N ? N : 0 is simply A & N if N is a power of two.  This
13562          is probably obsolete because the first operand should be a
13563          truth value (that's why we have the two cases above), but let's
13564          leave it in until we can confirm this for all front-ends.  */
13565       if (integer_zerop (op2)
13566           && TREE_CODE (arg0) == NE_EXPR
13567           && integer_zerop (TREE_OPERAND (arg0, 1))
13568           && integer_pow2p (arg1)
13569           && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR
13570           && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1),
13571                               arg1, OEP_ONLY_CONST))
13572         return pedantic_non_lvalue_loc (loc,
13573                                     fold_convert_loc (loc, type,
13574                                                       TREE_OPERAND (arg0, 0)));
13575
13576       /* Disable the transformations below for vectors, since
13577          fold_binary_op_with_conditional_arg may undo them immediately,
13578          yielding an infinite loop.  */
13579       if (code == VEC_COND_EXPR)
13580         return NULL_TREE;
13581
13582       /* Convert A ? B : 0 into A && B if A and B are truth values.  */
13583       if (integer_zerop (op2)
13584           && truth_value_p (TREE_CODE (arg0))
13585           && truth_value_p (TREE_CODE (arg1))
13586           && (code == VEC_COND_EXPR || !VECTOR_TYPE_P (type)))
13587         return fold_build2_loc (loc, code == VEC_COND_EXPR ? BIT_AND_EXPR
13588                                                            : TRUTH_ANDIF_EXPR,
13589                                 type, fold_convert_loc (loc, type, arg0), arg1);
13590
13591       /* Convert A ? B : 1 into !A || B if A and B are truth values.  */
13592       if (code == VEC_COND_EXPR ? integer_all_onesp (op2) : integer_onep (op2)
13593           && truth_value_p (TREE_CODE (arg0))
13594           && truth_value_p (TREE_CODE (arg1))
13595           && (code == VEC_COND_EXPR || !VECTOR_TYPE_P (type)))
13596         {
13597           location_t loc0 = expr_location_or (arg0, loc);
13598           /* Only perform transformation if ARG0 is easily inverted.  */
13599           tem = fold_invert_truthvalue (loc0, arg0);
13600           if (tem)
13601             return fold_build2_loc (loc, code == VEC_COND_EXPR
13602                                          ? BIT_IOR_EXPR
13603                                          : TRUTH_ORIF_EXPR,
13604                                     type, fold_convert_loc (loc, type, tem),
13605                                     arg1);
13606         }
13607
13608       /* Convert A ? 0 : B into !A && B if A and B are truth values.  */
13609       if (integer_zerop (arg1)
13610           && truth_value_p (TREE_CODE (arg0))
13611           && truth_value_p (TREE_CODE (op2))
13612           && (code == VEC_COND_EXPR || !VECTOR_TYPE_P (type)))
13613         {
13614           location_t loc0 = expr_location_or (arg0, loc);
13615           /* Only perform transformation if ARG0 is easily inverted.  */
13616           tem = fold_invert_truthvalue (loc0, arg0);
13617           if (tem)
13618             return fold_build2_loc (loc, code == VEC_COND_EXPR
13619                                          ? BIT_AND_EXPR : TRUTH_ANDIF_EXPR,
13620                                     type, fold_convert_loc (loc, type, tem),
13621                                     op2);
13622         }
13623
13624       /* Convert A ? 1 : B into A || B if A and B are truth values.  */
13625       if (code == VEC_COND_EXPR ? integer_all_onesp (arg1) : integer_onep (arg1)
13626           && truth_value_p (TREE_CODE (arg0))
13627           && truth_value_p (TREE_CODE (op2))
13628           && (code == VEC_COND_EXPR || !VECTOR_TYPE_P (type)))
13629         return fold_build2_loc (loc, code == VEC_COND_EXPR
13630                                      ? BIT_IOR_EXPR : TRUTH_ORIF_EXPR,
13631                                 type, fold_convert_loc (loc, type, arg0), op2);
13632
13633       return NULL_TREE;
13634
13635     case CALL_EXPR:
13636       /* CALL_EXPRs used to be ternary exprs.  Catch any mistaken uses
13637          of fold_ternary on them.  */
13638       gcc_unreachable ();
13639
13640     case BIT_FIELD_REF:
13641       if ((TREE_CODE (arg0) == VECTOR_CST
13642            || (TREE_CODE (arg0) == CONSTRUCTOR
13643                && TREE_CODE (TREE_TYPE (arg0)) == VECTOR_TYPE))
13644           && (type == TREE_TYPE (TREE_TYPE (arg0))
13645               || (TREE_CODE (type) == VECTOR_TYPE
13646                   && TREE_TYPE (type) == TREE_TYPE (TREE_TYPE (arg0)))))
13647         {
13648           tree eltype = TREE_TYPE (TREE_TYPE (arg0));
13649           unsigned HOST_WIDE_INT width = tree_to_uhwi (TYPE_SIZE (eltype));
13650           unsigned HOST_WIDE_INT n = tree_to_uhwi (arg1);
13651           unsigned HOST_WIDE_INT idx = tree_to_uhwi (op2);
13652
13653           if (n != 0
13654               && (idx % width) == 0
13655               && (n % width) == 0
13656               && ((idx + n) / width) <= TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
13657             {
13658               idx = idx / width;
13659               n = n / width;
13660
13661               if (TREE_CODE (arg0) == VECTOR_CST)
13662                 {
13663                   if (n == 1)
13664                     return VECTOR_CST_ELT (arg0, idx);
13665
13666                   tree *vals = XALLOCAVEC (tree, n);
13667                   for (unsigned i = 0; i < n; ++i)
13668                     vals[i] = VECTOR_CST_ELT (arg0, idx + i);
13669                   return build_vector (type, vals);
13670                 }
13671
13672               /* Constructor elements can be subvectors.  */
13673               unsigned HOST_WIDE_INT k = 1;
13674               if (CONSTRUCTOR_NELTS (arg0) != 0)
13675                 {
13676                   tree cons_elem = TREE_TYPE (CONSTRUCTOR_ELT (arg0, 0)->value);
13677                   if (TREE_CODE (cons_elem) == VECTOR_TYPE)
13678                     k = TYPE_VECTOR_SUBPARTS (cons_elem);
13679                 }
13680
13681               /* We keep an exact subset of the constructor elements.  */
13682               if ((idx % k) == 0 && (n % k) == 0)
13683                 {
13684                   if (CONSTRUCTOR_NELTS (arg0) == 0)
13685                     return build_constructor (type, NULL);
13686                   idx /= k;
13687                   n /= k;
13688                   if (n == 1)
13689                     {
13690                       if (idx < CONSTRUCTOR_NELTS (arg0))
13691                         return CONSTRUCTOR_ELT (arg0, idx)->value;
13692                       return build_zero_cst (type);
13693                     }
13694
13695                   vec<constructor_elt, va_gc> *vals;
13696                   vec_alloc (vals, n);
13697                   for (unsigned i = 0;
13698                        i < n && idx + i < CONSTRUCTOR_NELTS (arg0);
13699                        ++i)
13700                     CONSTRUCTOR_APPEND_ELT (vals, NULL_TREE,
13701                                             CONSTRUCTOR_ELT
13702                                               (arg0, idx + i)->value);
13703                   return build_constructor (type, vals);
13704                 }
13705               /* The bitfield references a single constructor element.  */
13706               else if (idx + n <= (idx / k + 1) * k)
13707                 {
13708                   if (CONSTRUCTOR_NELTS (arg0) <= idx / k)
13709                     return build_zero_cst (type);
13710                   else if (n == k)
13711                     return CONSTRUCTOR_ELT (arg0, idx / k)->value;
13712                   else
13713                     return fold_build3_loc (loc, code, type,
13714                       CONSTRUCTOR_ELT (arg0, idx / k)->value, op1,
13715                       build_int_cst (TREE_TYPE (op2), (idx % k) * width));
13716                 }
13717             }
13718         }
13719
13720       /* A bit-field-ref that referenced the full argument can be stripped.  */
13721       if (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
13722           && TYPE_PRECISION (TREE_TYPE (arg0)) == tree_to_uhwi (arg1)
13723           && integer_zerop (op2))
13724         return fold_convert_loc (loc, type, arg0);
13725
13726       /* On constants we can use native encode/interpret to constant
13727          fold (nearly) all BIT_FIELD_REFs.  */
13728       if (CONSTANT_CLASS_P (arg0)
13729           && can_native_interpret_type_p (type)
13730           && tree_fits_uhwi_p (TYPE_SIZE_UNIT (TREE_TYPE (arg0)))
13731           /* This limitation should not be necessary, we just need to
13732              round this up to mode size.  */
13733           && tree_to_uhwi (op1) % BITS_PER_UNIT == 0
13734           /* Need bit-shifting of the buffer to relax the following.  */
13735           && tree_to_uhwi (op2) % BITS_PER_UNIT == 0)
13736         {
13737           unsigned HOST_WIDE_INT bitpos = tree_to_uhwi (op2);
13738           unsigned HOST_WIDE_INT bitsize = tree_to_uhwi (op1);
13739           unsigned HOST_WIDE_INT clen;
13740           clen = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (arg0)));
13741           /* ???  We cannot tell native_encode_expr to start at
13742              some random byte only.  So limit us to a reasonable amount
13743              of work.  */
13744           if (clen <= 4096)
13745             {
13746               unsigned char *b = XALLOCAVEC (unsigned char, clen);
13747               unsigned HOST_WIDE_INT len = native_encode_expr (arg0, b, clen);
13748               if (len > 0
13749                   && len * BITS_PER_UNIT >= bitpos + bitsize)
13750                 {
13751                   tree v = native_interpret_expr (type,
13752                                                   b + bitpos / BITS_PER_UNIT,
13753                                                   bitsize / BITS_PER_UNIT);
13754                   if (v)
13755                     return v;
13756                 }
13757             }
13758         }
13759
13760       return NULL_TREE;
13761
13762     case FMA_EXPR:
13763       /* For integers we can decompose the FMA if possible.  */
13764       if (TREE_CODE (arg0) == INTEGER_CST
13765           && TREE_CODE (arg1) == INTEGER_CST)
13766         return fold_build2_loc (loc, PLUS_EXPR, type,
13767                                 const_binop (MULT_EXPR, arg0, arg1), arg2);
13768       if (integer_zerop (arg2))
13769         return fold_build2_loc (loc, MULT_EXPR, type, arg0, arg1);
13770
13771       return fold_fma (loc, type, arg0, arg1, arg2);
13772
13773     case VEC_PERM_EXPR:
13774       if (TREE_CODE (arg2) == VECTOR_CST)
13775         {
13776           unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i, mask, mask2;
13777           unsigned char *sel = XALLOCAVEC (unsigned char, 2 * nelts);
13778           unsigned char *sel2 = sel + nelts;
13779           bool need_mask_canon = false;
13780           bool need_mask_canon2 = false;
13781           bool all_in_vec0 = true;
13782           bool all_in_vec1 = true;
13783           bool maybe_identity = true;
13784           bool single_arg = (op0 == op1);
13785           bool changed = false;
13786
13787           mask2 = 2 * nelts - 1;
13788           mask = single_arg ? (nelts - 1) : mask2;
13789           gcc_assert (nelts == VECTOR_CST_NELTS (arg2));
13790           for (i = 0; i < nelts; i++)
13791             {
13792               tree val = VECTOR_CST_ELT (arg2, i);
13793               if (TREE_CODE (val) != INTEGER_CST)
13794                 return NULL_TREE;
13795
13796               /* Make sure that the perm value is in an acceptable
13797                  range.  */
13798               wide_int t = val;
13799               need_mask_canon |= wi::gtu_p (t, mask);
13800               need_mask_canon2 |= wi::gtu_p (t, mask2);
13801               sel[i] = t.to_uhwi () & mask;
13802               sel2[i] = t.to_uhwi () & mask2;
13803
13804               if (sel[i] < nelts)
13805                 all_in_vec1 = false;
13806               else
13807                 all_in_vec0 = false;
13808
13809               if ((sel[i] & (nelts-1)) != i)
13810                 maybe_identity = false;
13811             }
13812
13813           if (maybe_identity)
13814             {
13815               if (all_in_vec0)
13816                 return op0;
13817               if (all_in_vec1)
13818                 return op1;
13819             }
13820
13821           if (all_in_vec0)
13822             op1 = op0;
13823           else if (all_in_vec1)
13824             {
13825               op0 = op1;
13826               for (i = 0; i < nelts; i++)
13827                 sel[i] -= nelts;
13828               need_mask_canon = true;
13829             }
13830
13831           if ((TREE_CODE (op0) == VECTOR_CST
13832                || TREE_CODE (op0) == CONSTRUCTOR)
13833               && (TREE_CODE (op1) == VECTOR_CST
13834                   || TREE_CODE (op1) == CONSTRUCTOR))
13835             {
13836               tree t = fold_vec_perm (type, op0, op1, sel);
13837               if (t != NULL_TREE)
13838                 return t;
13839             }
13840
13841           if (op0 == op1 && !single_arg)
13842             changed = true;
13843
13844           /* Some targets are deficient and fail to expand a single
13845              argument permutation while still allowing an equivalent
13846              2-argument version.  */
13847           if (need_mask_canon && arg2 == op2
13848               && !can_vec_perm_p (TYPE_MODE (type), false, sel)
13849               && can_vec_perm_p (TYPE_MODE (type), false, sel2))
13850             {
13851               need_mask_canon = need_mask_canon2;
13852               sel = sel2;
13853             }
13854
13855           if (need_mask_canon && arg2 == op2)
13856             {
13857               tree *tsel = XALLOCAVEC (tree, nelts);
13858               tree eltype = TREE_TYPE (TREE_TYPE (arg2));
13859               for (i = 0; i < nelts; i++)
13860                 tsel[i] = build_int_cst (eltype, sel[i]);
13861               op2 = build_vector (TREE_TYPE (arg2), tsel);
13862               changed = true;
13863             }
13864
13865           if (changed)
13866             return build3_loc (loc, VEC_PERM_EXPR, type, op0, op1, op2);
13867         }
13868       return NULL_TREE;
13869
13870     default:
13871       return NULL_TREE;
13872     } /* switch (code) */
13873 }
13874
13875 /* Perform constant folding and related simplification of EXPR.
13876    The related simplifications include x*1 => x, x*0 => 0, etc.,
13877    and application of the associative law.
13878    NOP_EXPR conversions may be removed freely (as long as we
13879    are careful not to change the type of the overall expression).
13880    We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR,
13881    but we can constant-fold them if they have constant operands.  */
13882
13883 #ifdef ENABLE_FOLD_CHECKING
13884 # define fold(x) fold_1 (x)
13885 static tree fold_1 (tree);
13886 static
13887 #endif
13888 tree
13889 fold (tree expr)
13890 {
13891   const tree t = expr;
13892   enum tree_code code = TREE_CODE (t);
13893   enum tree_code_class kind = TREE_CODE_CLASS (code);
13894   tree tem;
13895   location_t loc = EXPR_LOCATION (expr);
13896
13897   /* Return right away if a constant.  */
13898   if (kind == tcc_constant)
13899     return t;
13900
13901   /* CALL_EXPR-like objects with variable numbers of operands are
13902      treated specially.  */
13903   if (kind == tcc_vl_exp)
13904     {
13905       if (code == CALL_EXPR)
13906         {
13907           tem = fold_call_expr (loc, expr, false);
13908           return tem ? tem : expr;
13909         }
13910       return expr;
13911     }
13912
13913   if (IS_EXPR_CODE_CLASS (kind))
13914     {
13915       tree type = TREE_TYPE (t);
13916       tree op0, op1, op2;
13917
13918       switch (TREE_CODE_LENGTH (code))
13919         {
13920         case 1:
13921           op0 = TREE_OPERAND (t, 0);
13922           tem = fold_unary_loc (loc, code, type, op0);
13923           return tem ? tem : expr;
13924         case 2:
13925           op0 = TREE_OPERAND (t, 0);
13926           op1 = TREE_OPERAND (t, 1);
13927           tem = fold_binary_loc (loc, code, type, op0, op1);
13928           return tem ? tem : expr;
13929         case 3:
13930           op0 = TREE_OPERAND (t, 0);
13931           op1 = TREE_OPERAND (t, 1);
13932           op2 = TREE_OPERAND (t, 2);
13933           tem = fold_ternary_loc (loc, code, type, op0, op1, op2);
13934           return tem ? tem : expr;
13935         default:
13936           break;
13937         }
13938     }
13939
13940   switch (code)
13941     {
13942     case ARRAY_REF:
13943       {
13944         tree op0 = TREE_OPERAND (t, 0);
13945         tree op1 = TREE_OPERAND (t, 1);
13946
13947         if (TREE_CODE (op1) == INTEGER_CST
13948             && TREE_CODE (op0) == CONSTRUCTOR
13949             && ! type_contains_placeholder_p (TREE_TYPE (op0)))
13950           {
13951             vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (op0);
13952             unsigned HOST_WIDE_INT end = vec_safe_length (elts);
13953             unsigned HOST_WIDE_INT begin = 0;
13954
13955             /* Find a matching index by means of a binary search.  */
13956             while (begin != end)
13957               {
13958                 unsigned HOST_WIDE_INT middle = (begin + end) / 2;
13959                 tree index = (*elts)[middle].index;
13960
13961                 if (TREE_CODE (index) == INTEGER_CST
13962                     && tree_int_cst_lt (index, op1))
13963                   begin = middle + 1;
13964                 else if (TREE_CODE (index) == INTEGER_CST
13965                          && tree_int_cst_lt (op1, index))
13966                   end = middle;
13967                 else if (TREE_CODE (index) == RANGE_EXPR
13968                          && tree_int_cst_lt (TREE_OPERAND (index, 1), op1))
13969                   begin = middle + 1;
13970                 else if (TREE_CODE (index) == RANGE_EXPR
13971                          && tree_int_cst_lt (op1, TREE_OPERAND (index, 0)))
13972                   end = middle;
13973                 else
13974                   return (*elts)[middle].value;
13975               }
13976           }
13977
13978         return t;
13979       }
13980
13981       /* Return a VECTOR_CST if possible.  */
13982     case CONSTRUCTOR:
13983       {
13984         tree type = TREE_TYPE (t);
13985         if (TREE_CODE (type) != VECTOR_TYPE)
13986           return t;
13987
13988         tree *vec = XALLOCAVEC (tree, TYPE_VECTOR_SUBPARTS (type));
13989         unsigned HOST_WIDE_INT idx, pos = 0;
13990         tree value;
13991
13992         FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), idx, value)
13993           {
13994             if (!CONSTANT_CLASS_P (value))
13995               return t;
13996             if (TREE_CODE (value) == VECTOR_CST)
13997               {
13998                 for (unsigned i = 0; i < VECTOR_CST_NELTS (value); ++i)
13999                   vec[pos++] = VECTOR_CST_ELT (value, i);
14000               }
14001             else
14002               vec[pos++] = value;
14003           }
14004         for (; pos < TYPE_VECTOR_SUBPARTS (type); ++pos)
14005           vec[pos] = build_zero_cst (TREE_TYPE (type));
14006
14007         return build_vector (type, vec);
14008       }
14009
14010     case CONST_DECL:
14011       return fold (DECL_INITIAL (t));
14012
14013     default:
14014       return t;
14015     } /* switch (code) */
14016 }
14017
14018 #ifdef ENABLE_FOLD_CHECKING
14019 #undef fold
14020
14021 static void fold_checksum_tree (const_tree, struct md5_ctx *,
14022                                 hash_table<pointer_hash<const tree_node> > *);
14023 static void fold_check_failed (const_tree, const_tree);
14024 void print_fold_checksum (const_tree);
14025
14026 /* When --enable-checking=fold, compute a digest of expr before
14027    and after actual fold call to see if fold did not accidentally
14028    change original expr.  */
14029
14030 tree
14031 fold (tree expr)
14032 {
14033   tree ret;
14034   struct md5_ctx ctx;
14035   unsigned char checksum_before[16], checksum_after[16];
14036   hash_table<pointer_hash<const tree_node> > ht (32);
14037
14038   md5_init_ctx (&ctx);
14039   fold_checksum_tree (expr, &ctx, &ht);
14040   md5_finish_ctx (&ctx, checksum_before);
14041   ht.empty ();
14042
14043   ret = fold_1 (expr);
14044
14045   md5_init_ctx (&ctx);
14046   fold_checksum_tree (expr, &ctx, &ht);
14047   md5_finish_ctx (&ctx, checksum_after);
14048
14049   if (memcmp (checksum_before, checksum_after, 16))
14050     fold_check_failed (expr, ret);
14051
14052   return ret;
14053 }
14054
14055 void
14056 print_fold_checksum (const_tree expr)
14057 {
14058   struct md5_ctx ctx;
14059   unsigned char checksum[16], cnt;
14060   hash_table<pointer_hash<const tree_node> > ht (32);
14061
14062   md5_init_ctx (&ctx);
14063   fold_checksum_tree (expr, &ctx, &ht);
14064   md5_finish_ctx (&ctx, checksum);
14065   for (cnt = 0; cnt < 16; ++cnt)
14066     fprintf (stderr, "%02x", checksum[cnt]);
14067   putc ('\n', stderr);
14068 }
14069
14070 static void
14071 fold_check_failed (const_tree expr ATTRIBUTE_UNUSED, const_tree ret ATTRIBUTE_UNUSED)
14072 {
14073   internal_error ("fold check: original tree changed by fold");
14074 }
14075
14076 static void
14077 fold_checksum_tree (const_tree expr, struct md5_ctx *ctx,
14078                     hash_table<pointer_hash <const tree_node> > *ht)
14079 {
14080   const tree_node **slot;
14081   enum tree_code code;
14082   union tree_node buf;
14083   int i, len;
14084
14085  recursive_label:
14086   if (expr == NULL)
14087     return;
14088   slot = ht->find_slot (expr, INSERT);
14089   if (*slot != NULL)
14090     return;
14091   *slot = expr;
14092   code = TREE_CODE (expr);
14093   if (TREE_CODE_CLASS (code) == tcc_declaration
14094       && HAS_DECL_ASSEMBLER_NAME_P (expr))
14095     {
14096       /* Allow DECL_ASSEMBLER_NAME and symtab_node to be modified.  */
14097       memcpy ((char *) &buf, expr, tree_size (expr));
14098       SET_DECL_ASSEMBLER_NAME ((tree)&buf, NULL);
14099       buf.decl_with_vis.symtab_node = NULL;
14100       expr = (tree) &buf;
14101     }
14102   else if (TREE_CODE_CLASS (code) == tcc_type
14103            && (TYPE_POINTER_TO (expr)
14104                || TYPE_REFERENCE_TO (expr)
14105                || TYPE_CACHED_VALUES_P (expr)
14106                || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)
14107                || TYPE_NEXT_VARIANT (expr)))
14108     {
14109       /* Allow these fields to be modified.  */
14110       tree tmp;
14111       memcpy ((char *) &buf, expr, tree_size (expr));
14112       expr = tmp = (tree) &buf;
14113       TYPE_CONTAINS_PLACEHOLDER_INTERNAL (tmp) = 0;
14114       TYPE_POINTER_TO (tmp) = NULL;
14115       TYPE_REFERENCE_TO (tmp) = NULL;
14116       TYPE_NEXT_VARIANT (tmp) = NULL;
14117       if (TYPE_CACHED_VALUES_P (tmp))
14118         {
14119           TYPE_CACHED_VALUES_P (tmp) = 0;
14120           TYPE_CACHED_VALUES (tmp) = NULL;
14121         }
14122     }
14123   md5_process_bytes (expr, tree_size (expr), ctx);
14124   if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
14125     fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
14126   if (TREE_CODE_CLASS (code) != tcc_type
14127       && TREE_CODE_CLASS (code) != tcc_declaration
14128       && code != TREE_LIST
14129       && code != SSA_NAME
14130       && CODE_CONTAINS_STRUCT (code, TS_COMMON))
14131     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
14132   switch (TREE_CODE_CLASS (code))
14133     {
14134     case tcc_constant:
14135       switch (code)
14136         {
14137         case STRING_CST:
14138           md5_process_bytes (TREE_STRING_POINTER (expr),
14139                              TREE_STRING_LENGTH (expr), ctx);
14140           break;
14141         case COMPLEX_CST:
14142           fold_checksum_tree (TREE_REALPART (expr), ctx, ht);
14143           fold_checksum_tree (TREE_IMAGPART (expr), ctx, ht);
14144           break;
14145         case VECTOR_CST:
14146           for (i = 0; i < (int) VECTOR_CST_NELTS (expr); ++i)
14147             fold_checksum_tree (VECTOR_CST_ELT (expr, i), ctx, ht);
14148           break;
14149         default:
14150           break;
14151         }
14152       break;
14153     case tcc_exceptional:
14154       switch (code)
14155         {
14156         case TREE_LIST:
14157           fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
14158           fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
14159           expr = TREE_CHAIN (expr);
14160           goto recursive_label;
14161           break;
14162         case TREE_VEC:
14163           for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
14164             fold_checksum_tree (TREE_VEC_ELT (expr, i), ctx, ht);
14165           break;
14166         default:
14167           break;
14168         }
14169       break;
14170     case tcc_expression:
14171     case tcc_reference:
14172     case tcc_comparison:
14173     case tcc_unary:
14174     case tcc_binary:
14175     case tcc_statement:
14176     case tcc_vl_exp:
14177       len = TREE_OPERAND_LENGTH (expr);
14178       for (i = 0; i < len; ++i)
14179         fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
14180       break;
14181     case tcc_declaration:
14182       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
14183       fold_checksum_tree (DECL_CONTEXT (expr), ctx, ht);
14184       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_COMMON))
14185         {
14186           fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
14187           fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
14188           fold_checksum_tree (DECL_INITIAL (expr), ctx, ht);
14189           fold_checksum_tree (DECL_ABSTRACT_ORIGIN (expr), ctx, ht);
14190           fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
14191         }
14192
14193       if (CODE_CONTAINS_STRUCT (TREE_CODE (expr), TS_DECL_NON_COMMON))
14194         {
14195           if (TREE_CODE (expr) == FUNCTION_DECL)
14196             {
14197               fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
14198               fold_checksum_tree (DECL_ARGUMENTS (expr), ctx, ht);
14199             }
14200           fold_checksum_tree (DECL_RESULT_FLD (expr), ctx, ht);
14201         }
14202       break;
14203     case tcc_type:
14204       if (TREE_CODE (expr) == ENUMERAL_TYPE)
14205         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
14206       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
14207       fold_checksum_tree (TYPE_SIZE_UNIT (expr), ctx, ht);
14208       fold_checksum_tree (TYPE_ATTRIBUTES (expr), ctx, ht);
14209       fold_checksum_tree (TYPE_NAME (expr), ctx, ht);
14210       if (INTEGRAL_TYPE_P (expr)
14211           || SCALAR_FLOAT_TYPE_P (expr))
14212         {
14213           fold_checksum_tree (TYPE_MIN_VALUE (expr), ctx, ht);
14214           fold_checksum_tree (TYPE_MAX_VALUE (expr), ctx, ht);
14215         }
14216       fold_checksum_tree (TYPE_MAIN_VARIANT (expr), ctx, ht);
14217       if (TREE_CODE (expr) == RECORD_TYPE
14218           || TREE_CODE (expr) == UNION_TYPE
14219           || TREE_CODE (expr) == QUAL_UNION_TYPE)
14220         fold_checksum_tree (TYPE_BINFO (expr), ctx, ht);
14221       fold_checksum_tree (TYPE_CONTEXT (expr), ctx, ht);
14222       break;
14223     default:
14224       break;
14225     }
14226 }
14227
14228 /* Helper function for outputting the checksum of a tree T.  When
14229    debugging with gdb, you can "define mynext" to be "next" followed
14230    by "call debug_fold_checksum (op0)", then just trace down till the
14231    outputs differ.  */
14232
14233 DEBUG_FUNCTION void
14234 debug_fold_checksum (const_tree t)
14235 {
14236   int i;
14237   unsigned char checksum[16];
14238   struct md5_ctx ctx;
14239   hash_table<pointer_hash<const tree_node> > ht (32);
14240
14241   md5_init_ctx (&ctx);
14242   fold_checksum_tree (t, &ctx, &ht);
14243   md5_finish_ctx (&ctx, checksum);
14244   ht.empty ();
14245
14246   for (i = 0; i < 16; i++)
14247     fprintf (stderr, "%d ", checksum[i]);
14248
14249   fprintf (stderr, "\n");
14250 }
14251
14252 #endif
14253
14254 /* Fold a unary tree expression with code CODE of type TYPE with an
14255    operand OP0.  LOC is the location of the resulting expression.
14256    Return a folded expression if successful.  Otherwise, return a tree
14257    expression with code CODE of type TYPE with an operand OP0.  */
14258
14259 tree
14260 fold_build1_stat_loc (location_t loc,
14261                       enum tree_code code, tree type, tree op0 MEM_STAT_DECL)
14262 {
14263   tree tem;
14264 #ifdef ENABLE_FOLD_CHECKING
14265   unsigned char checksum_before[16], checksum_after[16];
14266   struct md5_ctx ctx;
14267   hash_table<pointer_hash<const tree_node> > ht (32);
14268
14269   md5_init_ctx (&ctx);
14270   fold_checksum_tree (op0, &ctx, &ht);
14271   md5_finish_ctx (&ctx, checksum_before);
14272   ht.empty ();
14273 #endif
14274
14275   tem = fold_unary_loc (loc, code, type, op0);
14276   if (!tem)
14277     tem = build1_stat_loc (loc, code, type, op0 PASS_MEM_STAT);
14278
14279 #ifdef ENABLE_FOLD_CHECKING
14280   md5_init_ctx (&ctx);
14281   fold_checksum_tree (op0, &ctx, &ht);
14282   md5_finish_ctx (&ctx, checksum_after);
14283
14284   if (memcmp (checksum_before, checksum_after, 16))
14285     fold_check_failed (op0, tem);
14286 #endif
14287   return tem;
14288 }
14289
14290 /* Fold a binary tree expression with code CODE of type TYPE with
14291    operands OP0 and OP1.  LOC is the location of the resulting
14292    expression.  Return a folded expression if successful.  Otherwise,
14293    return a tree expression with code CODE of type TYPE with operands
14294    OP0 and OP1.  */
14295
14296 tree
14297 fold_build2_stat_loc (location_t loc,
14298                       enum tree_code code, tree type, tree op0, tree op1
14299                       MEM_STAT_DECL)
14300 {
14301   tree tem;
14302 #ifdef ENABLE_FOLD_CHECKING
14303   unsigned char checksum_before_op0[16],
14304                 checksum_before_op1[16],
14305                 checksum_after_op0[16],
14306                 checksum_after_op1[16];
14307   struct md5_ctx ctx;
14308   hash_table<pointer_hash<const tree_node> > ht (32);
14309
14310   md5_init_ctx (&ctx);
14311   fold_checksum_tree (op0, &ctx, &ht);
14312   md5_finish_ctx (&ctx, checksum_before_op0);
14313   ht.empty ();
14314
14315   md5_init_ctx (&ctx);
14316   fold_checksum_tree (op1, &ctx, &ht);
14317   md5_finish_ctx (&ctx, checksum_before_op1);
14318   ht.empty ();
14319 #endif
14320
14321   tem = fold_binary_loc (loc, code, type, op0, op1);
14322   if (!tem)
14323     tem = build2_stat_loc (loc, code, type, op0, op1 PASS_MEM_STAT);
14324
14325 #ifdef ENABLE_FOLD_CHECKING
14326   md5_init_ctx (&ctx);
14327   fold_checksum_tree (op0, &ctx, &ht);
14328   md5_finish_ctx (&ctx, checksum_after_op0);
14329   ht.empty ();
14330
14331   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
14332     fold_check_failed (op0, tem);
14333
14334   md5_init_ctx (&ctx);
14335   fold_checksum_tree (op1, &ctx, &ht);
14336   md5_finish_ctx (&ctx, checksum_after_op1);
14337
14338   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
14339     fold_check_failed (op1, tem);
14340 #endif
14341   return tem;
14342 }
14343
14344 /* Fold a ternary tree expression with code CODE of type TYPE with
14345    operands OP0, OP1, and OP2.  Return a folded expression if
14346    successful.  Otherwise, return a tree expression with code CODE of
14347    type TYPE with operands OP0, OP1, and OP2.  */
14348
14349 tree
14350 fold_build3_stat_loc (location_t loc, enum tree_code code, tree type,
14351                       tree op0, tree op1, tree op2 MEM_STAT_DECL)
14352 {
14353   tree tem;
14354 #ifdef ENABLE_FOLD_CHECKING
14355   unsigned char checksum_before_op0[16],
14356                 checksum_before_op1[16],
14357                 checksum_before_op2[16],
14358                 checksum_after_op0[16],
14359                 checksum_after_op1[16],
14360                 checksum_after_op2[16];
14361   struct md5_ctx ctx;
14362   hash_table<pointer_hash<const tree_node> > ht (32);
14363
14364   md5_init_ctx (&ctx);
14365   fold_checksum_tree (op0, &ctx, &ht);
14366   md5_finish_ctx (&ctx, checksum_before_op0);
14367   ht.empty ();
14368
14369   md5_init_ctx (&ctx);
14370   fold_checksum_tree (op1, &ctx, &ht);
14371   md5_finish_ctx (&ctx, checksum_before_op1);
14372   ht.empty ();
14373
14374   md5_init_ctx (&ctx);
14375   fold_checksum_tree (op2, &ctx, &ht);
14376   md5_finish_ctx (&ctx, checksum_before_op2);
14377   ht.empty ();
14378 #endif
14379
14380   gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
14381   tem = fold_ternary_loc (loc, code, type, op0, op1, op2);
14382   if (!tem)
14383     tem = build3_stat_loc (loc, code, type, op0, op1, op2 PASS_MEM_STAT);
14384
14385 #ifdef ENABLE_FOLD_CHECKING
14386   md5_init_ctx (&ctx);
14387   fold_checksum_tree (op0, &ctx, &ht);
14388   md5_finish_ctx (&ctx, checksum_after_op0);
14389   ht.empty ();
14390
14391   if (memcmp (checksum_before_op0, checksum_after_op0, 16))
14392     fold_check_failed (op0, tem);
14393
14394   md5_init_ctx (&ctx);
14395   fold_checksum_tree (op1, &ctx, &ht);
14396   md5_finish_ctx (&ctx, checksum_after_op1);
14397   ht.empty ();
14398
14399   if (memcmp (checksum_before_op1, checksum_after_op1, 16))
14400     fold_check_failed (op1, tem);
14401
14402   md5_init_ctx (&ctx);
14403   fold_checksum_tree (op2, &ctx, &ht);
14404   md5_finish_ctx (&ctx, checksum_after_op2);
14405
14406   if (memcmp (checksum_before_op2, checksum_after_op2, 16))
14407     fold_check_failed (op2, tem);
14408 #endif
14409   return tem;
14410 }
14411
14412 /* Fold a CALL_EXPR expression of type TYPE with operands FN and NARGS
14413    arguments in ARGARRAY, and a null static chain.
14414    Return a folded expression if successful.  Otherwise, return a CALL_EXPR
14415    of type TYPE from the given operands as constructed by build_call_array.  */
14416
14417 tree
14418 fold_build_call_array_loc (location_t loc, tree type, tree fn,
14419                            int nargs, tree *argarray)
14420 {
14421   tree tem;
14422 #ifdef ENABLE_FOLD_CHECKING
14423   unsigned char checksum_before_fn[16],
14424                 checksum_before_arglist[16],
14425                 checksum_after_fn[16],
14426                 checksum_after_arglist[16];
14427   struct md5_ctx ctx;
14428   hash_table<pointer_hash<const tree_node> > ht (32);
14429   int i;
14430
14431   md5_init_ctx (&ctx);
14432   fold_checksum_tree (fn, &ctx, &ht);
14433   md5_finish_ctx (&ctx, checksum_before_fn);
14434   ht.empty ();
14435
14436   md5_init_ctx (&ctx);
14437   for (i = 0; i < nargs; i++)
14438     fold_checksum_tree (argarray[i], &ctx, &ht);
14439   md5_finish_ctx (&ctx, checksum_before_arglist);
14440   ht.empty ();
14441 #endif
14442
14443   tem = fold_builtin_call_array (loc, type, fn, nargs, argarray);
14444   if (!tem)
14445     tem = build_call_array_loc (loc, type, fn, nargs, argarray);
14446
14447 #ifdef ENABLE_FOLD_CHECKING
14448   md5_init_ctx (&ctx);
14449   fold_checksum_tree (fn, &ctx, &ht);
14450   md5_finish_ctx (&ctx, checksum_after_fn);
14451   ht.empty ();
14452
14453   if (memcmp (checksum_before_fn, checksum_after_fn, 16))
14454     fold_check_failed (fn, tem);
14455
14456   md5_init_ctx (&ctx);
14457   for (i = 0; i < nargs; i++)
14458     fold_checksum_tree (argarray[i], &ctx, &ht);
14459   md5_finish_ctx (&ctx, checksum_after_arglist);
14460
14461   if (memcmp (checksum_before_arglist, checksum_after_arglist, 16))
14462     fold_check_failed (NULL_TREE, tem);
14463 #endif
14464   return tem;
14465 }
14466
14467 /* Perform constant folding and related simplification of initializer
14468    expression EXPR.  These behave identically to "fold_buildN" but ignore
14469    potential run-time traps and exceptions that fold must preserve.  */
14470
14471 #define START_FOLD_INIT \
14472   int saved_signaling_nans = flag_signaling_nans;\
14473   int saved_trapping_math = flag_trapping_math;\
14474   int saved_rounding_math = flag_rounding_math;\
14475   int saved_trapv = flag_trapv;\
14476   int saved_folding_initializer = folding_initializer;\
14477   flag_signaling_nans = 0;\
14478   flag_trapping_math = 0;\
14479   flag_rounding_math = 0;\
14480   flag_trapv = 0;\
14481   folding_initializer = 1;
14482
14483 #define END_FOLD_INIT \
14484   flag_signaling_nans = saved_signaling_nans;\
14485   flag_trapping_math = saved_trapping_math;\
14486   flag_rounding_math = saved_rounding_math;\
14487   flag_trapv = saved_trapv;\
14488   folding_initializer = saved_folding_initializer;
14489
14490 tree
14491 fold_build1_initializer_loc (location_t loc, enum tree_code code,
14492                              tree type, tree op)
14493 {
14494   tree result;
14495   START_FOLD_INIT;
14496
14497   result = fold_build1_loc (loc, code, type, op);
14498
14499   END_FOLD_INIT;
14500   return result;
14501 }
14502
14503 tree
14504 fold_build2_initializer_loc (location_t loc, enum tree_code code,
14505                              tree type, tree op0, tree op1)
14506 {
14507   tree result;
14508   START_FOLD_INIT;
14509
14510   result = fold_build2_loc (loc, code, type, op0, op1);
14511
14512   END_FOLD_INIT;
14513   return result;
14514 }
14515
14516 tree
14517 fold_build_call_array_initializer_loc (location_t loc, tree type, tree fn,
14518                                        int nargs, tree *argarray)
14519 {
14520   tree result;
14521   START_FOLD_INIT;
14522
14523   result = fold_build_call_array_loc (loc, type, fn, nargs, argarray);
14524
14525   END_FOLD_INIT;
14526   return result;
14527 }
14528
14529 #undef START_FOLD_INIT
14530 #undef END_FOLD_INIT
14531
14532 /* Determine if first argument is a multiple of second argument.  Return 0 if
14533    it is not, or we cannot easily determined it to be.
14534
14535    An example of the sort of thing we care about (at this point; this routine
14536    could surely be made more general, and expanded to do what the *_DIV_EXPR's
14537    fold cases do now) is discovering that
14538
14539      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
14540
14541    is a multiple of
14542
14543      SAVE_EXPR (J * 8)
14544
14545    when we know that the two SAVE_EXPR (J * 8) nodes are the same node.
14546
14547    This code also handles discovering that
14548
14549      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
14550
14551    is a multiple of 8 so we don't have to worry about dealing with a
14552    possible remainder.
14553
14554    Note that we *look* inside a SAVE_EXPR only to determine how it was
14555    calculated; it is not safe for fold to do much of anything else with the
14556    internals of a SAVE_EXPR, since it cannot know when it will be evaluated
14557    at run time.  For example, the latter example above *cannot* be implemented
14558    as SAVE_EXPR (I) * J or any variant thereof, since the value of J at
14559    evaluation time of the original SAVE_EXPR is not necessarily the same at
14560    the time the new expression is evaluated.  The only optimization of this
14561    sort that would be valid is changing
14562
14563      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
14564
14565    divided by 8 to
14566
14567      SAVE_EXPR (I) * SAVE_EXPR (J)
14568
14569    (where the same SAVE_EXPR (J) is used in the original and the
14570    transformed version).  */
14571
14572 int
14573 multiple_of_p (tree type, const_tree top, const_tree bottom)
14574 {
14575   if (operand_equal_p (top, bottom, 0))
14576     return 1;
14577
14578   if (TREE_CODE (type) != INTEGER_TYPE)
14579     return 0;
14580
14581   switch (TREE_CODE (top))
14582     {
14583     case BIT_AND_EXPR:
14584       /* Bitwise and provides a power of two multiple.  If the mask is
14585          a multiple of BOTTOM then TOP is a multiple of BOTTOM.  */
14586       if (!integer_pow2p (bottom))
14587         return 0;
14588       /* FALLTHRU */
14589
14590     case MULT_EXPR:
14591       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
14592               || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
14593
14594     case PLUS_EXPR:
14595     case MINUS_EXPR:
14596       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
14597               && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
14598
14599     case LSHIFT_EXPR:
14600       if (TREE_CODE (TREE_OPERAND (top, 1)) == INTEGER_CST)
14601         {
14602           tree op1, t1;
14603
14604           op1 = TREE_OPERAND (top, 1);
14605           /* const_binop may not detect overflow correctly,
14606              so check for it explicitly here.  */
14607           if (wi::gtu_p (TYPE_PRECISION (TREE_TYPE (size_one_node)), op1)
14608               && 0 != (t1 = fold_convert (type,
14609                                           const_binop (LSHIFT_EXPR,
14610                                                        size_one_node,
14611                                                        op1)))
14612               && !TREE_OVERFLOW (t1))
14613             return multiple_of_p (type, t1, bottom);
14614         }
14615       return 0;
14616
14617     case NOP_EXPR:
14618       /* Can't handle conversions from non-integral or wider integral type.  */
14619       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
14620           || (TYPE_PRECISION (type)
14621               < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
14622         return 0;
14623
14624       /* .. fall through ...  */
14625
14626     case SAVE_EXPR:
14627       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
14628
14629     case COND_EXPR:
14630       return (multiple_of_p (type, TREE_OPERAND (top, 1), bottom)
14631               && multiple_of_p (type, TREE_OPERAND (top, 2), bottom));
14632
14633     case INTEGER_CST:
14634       if (TREE_CODE (bottom) != INTEGER_CST
14635           || integer_zerop (bottom)
14636           || (TYPE_UNSIGNED (type)
14637               && (tree_int_cst_sgn (top) < 0
14638                   || tree_int_cst_sgn (bottom) < 0)))
14639         return 0;
14640       return wi::multiple_of_p (wi::to_widest (top), wi::to_widest (bottom),
14641                                 SIGNED);
14642
14643     default:
14644       return 0;
14645     }
14646 }
14647
14648 /* Return true if CODE or TYPE is known to be non-negative. */
14649
14650 static bool
14651 tree_simple_nonnegative_warnv_p (enum tree_code code, tree type)
14652 {
14653   if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
14654       && truth_value_p (code))
14655     /* Truth values evaluate to 0 or 1, which is nonnegative unless we
14656        have a signed:1 type (where the value is -1 and 0).  */
14657     return true;
14658   return false;
14659 }
14660
14661 /* Return true if (CODE OP0) is known to be non-negative.  If the return
14662    value is based on the assumption that signed overflow is undefined,
14663    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14664    *STRICT_OVERFLOW_P.  */
14665
14666 bool
14667 tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
14668                                 bool *strict_overflow_p)
14669 {
14670   if (TYPE_UNSIGNED (type))
14671     return true;
14672
14673   switch (code)
14674     {
14675     case ABS_EXPR:
14676       /* We can't return 1 if flag_wrapv is set because
14677          ABS_EXPR<INT_MIN> = INT_MIN.  */
14678       if (!ANY_INTEGRAL_TYPE_P (type))
14679         return true;
14680       if (TYPE_OVERFLOW_UNDEFINED (type))
14681         {
14682           *strict_overflow_p = true;
14683           return true;
14684         }
14685       break;
14686
14687     case NON_LVALUE_EXPR:
14688     case FLOAT_EXPR:
14689     case FIX_TRUNC_EXPR:
14690       return tree_expr_nonnegative_warnv_p (op0,
14691                                             strict_overflow_p);
14692
14693     CASE_CONVERT:
14694       {
14695         tree inner_type = TREE_TYPE (op0);
14696         tree outer_type = type;
14697
14698         if (TREE_CODE (outer_type) == REAL_TYPE)
14699           {
14700             if (TREE_CODE (inner_type) == REAL_TYPE)
14701               return tree_expr_nonnegative_warnv_p (op0,
14702                                                     strict_overflow_p);
14703             if (INTEGRAL_TYPE_P (inner_type))
14704               {
14705                 if (TYPE_UNSIGNED (inner_type))
14706                   return true;
14707                 return tree_expr_nonnegative_warnv_p (op0,
14708                                                       strict_overflow_p);
14709               }
14710           }
14711         else if (INTEGRAL_TYPE_P (outer_type))
14712           {
14713             if (TREE_CODE (inner_type) == REAL_TYPE)
14714               return tree_expr_nonnegative_warnv_p (op0,
14715                                                     strict_overflow_p);
14716             if (INTEGRAL_TYPE_P (inner_type))
14717               return TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type)
14718                       && TYPE_UNSIGNED (inner_type);
14719           }
14720       }
14721       break;
14722
14723     default:
14724       return tree_simple_nonnegative_warnv_p (code, type);
14725     }
14726
14727   /* We don't know sign of `t', so be conservative and return false.  */
14728   return false;
14729 }
14730
14731 /* Return true if (CODE OP0 OP1) is known to be non-negative.  If the return
14732    value is based on the assumption that signed overflow is undefined,
14733    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14734    *STRICT_OVERFLOW_P.  */
14735
14736 bool
14737 tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
14738                                       tree op1, bool *strict_overflow_p)
14739 {
14740   if (TYPE_UNSIGNED (type))
14741     return true;
14742
14743   switch (code)
14744     {
14745     case POINTER_PLUS_EXPR:
14746     case PLUS_EXPR:
14747       if (FLOAT_TYPE_P (type))
14748         return (tree_expr_nonnegative_warnv_p (op0,
14749                                                strict_overflow_p)
14750                 && tree_expr_nonnegative_warnv_p (op1,
14751                                                   strict_overflow_p));
14752
14753       /* zero_extend(x) + zero_extend(y) is non-negative if x and y are
14754          both unsigned and at least 2 bits shorter than the result.  */
14755       if (TREE_CODE (type) == INTEGER_TYPE
14756           && TREE_CODE (op0) == NOP_EXPR
14757           && TREE_CODE (op1) == NOP_EXPR)
14758         {
14759           tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0));
14760           tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0));
14761           if (TREE_CODE (inner1) == INTEGER_TYPE && TYPE_UNSIGNED (inner1)
14762               && TREE_CODE (inner2) == INTEGER_TYPE && TYPE_UNSIGNED (inner2))
14763             {
14764               unsigned int prec = MAX (TYPE_PRECISION (inner1),
14765                                        TYPE_PRECISION (inner2)) + 1;
14766               return prec < TYPE_PRECISION (type);
14767             }
14768         }
14769       break;
14770
14771     case MULT_EXPR:
14772       if (FLOAT_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
14773         {
14774           /* x * x is always non-negative for floating point x
14775              or without overflow.  */
14776           if (operand_equal_p (op0, op1, 0)
14777               || (tree_expr_nonnegative_warnv_p (op0, strict_overflow_p)
14778                   && tree_expr_nonnegative_warnv_p (op1, strict_overflow_p)))
14779             {
14780               if (ANY_INTEGRAL_TYPE_P (type)
14781                   && TYPE_OVERFLOW_UNDEFINED (type))
14782                 *strict_overflow_p = true;
14783               return true;
14784             }
14785         }
14786
14787       /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
14788          both unsigned and their total bits is shorter than the result.  */
14789       if (TREE_CODE (type) == INTEGER_TYPE
14790           && (TREE_CODE (op0) == NOP_EXPR || TREE_CODE (op0) == INTEGER_CST)
14791           && (TREE_CODE (op1) == NOP_EXPR || TREE_CODE (op1) == INTEGER_CST))
14792         {
14793           tree inner0 = (TREE_CODE (op0) == NOP_EXPR)
14794             ? TREE_TYPE (TREE_OPERAND (op0, 0))
14795             : TREE_TYPE (op0);
14796           tree inner1 = (TREE_CODE (op1) == NOP_EXPR)
14797             ? TREE_TYPE (TREE_OPERAND (op1, 0))
14798             : TREE_TYPE (op1);
14799
14800           bool unsigned0 = TYPE_UNSIGNED (inner0);
14801           bool unsigned1 = TYPE_UNSIGNED (inner1);
14802
14803           if (TREE_CODE (op0) == INTEGER_CST)
14804             unsigned0 = unsigned0 || tree_int_cst_sgn (op0) >= 0;
14805
14806           if (TREE_CODE (op1) == INTEGER_CST)
14807             unsigned1 = unsigned1 || tree_int_cst_sgn (op1) >= 0;
14808
14809           if (TREE_CODE (inner0) == INTEGER_TYPE && unsigned0
14810               && TREE_CODE (inner1) == INTEGER_TYPE && unsigned1)
14811             {
14812               unsigned int precision0 = (TREE_CODE (op0) == INTEGER_CST)
14813                 ? tree_int_cst_min_precision (op0, UNSIGNED)
14814                 : TYPE_PRECISION (inner0);
14815
14816               unsigned int precision1 = (TREE_CODE (op1) == INTEGER_CST)
14817                 ? tree_int_cst_min_precision (op1, UNSIGNED)
14818                 : TYPE_PRECISION (inner1);
14819
14820               return precision0 + precision1 < TYPE_PRECISION (type);
14821             }
14822         }
14823       return false;
14824
14825     case BIT_AND_EXPR:
14826     case MAX_EXPR:
14827       return (tree_expr_nonnegative_warnv_p (op0,
14828                                              strict_overflow_p)
14829               || tree_expr_nonnegative_warnv_p (op1,
14830                                                 strict_overflow_p));
14831
14832     case BIT_IOR_EXPR:
14833     case BIT_XOR_EXPR:
14834     case MIN_EXPR:
14835     case RDIV_EXPR:
14836     case TRUNC_DIV_EXPR:
14837     case CEIL_DIV_EXPR:
14838     case FLOOR_DIV_EXPR:
14839     case ROUND_DIV_EXPR:
14840       return (tree_expr_nonnegative_warnv_p (op0,
14841                                              strict_overflow_p)
14842               && tree_expr_nonnegative_warnv_p (op1,
14843                                                 strict_overflow_p));
14844
14845     case TRUNC_MOD_EXPR:
14846     case CEIL_MOD_EXPR:
14847     case FLOOR_MOD_EXPR:
14848     case ROUND_MOD_EXPR:
14849       return tree_expr_nonnegative_warnv_p (op0,
14850                                             strict_overflow_p);
14851     default:
14852       return tree_simple_nonnegative_warnv_p (code, type);
14853     }
14854
14855   /* We don't know sign of `t', so be conservative and return false.  */
14856   return false;
14857 }
14858
14859 /* Return true if T is known to be non-negative.  If the return
14860    value is based on the assumption that signed overflow is undefined,
14861    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14862    *STRICT_OVERFLOW_P.  */
14863
14864 bool
14865 tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
14866 {
14867   if (TYPE_UNSIGNED (TREE_TYPE (t)))
14868     return true;
14869
14870   switch (TREE_CODE (t))
14871     {
14872     case INTEGER_CST:
14873       return tree_int_cst_sgn (t) >= 0;
14874
14875     case REAL_CST:
14876       return ! REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));
14877
14878     case FIXED_CST:
14879       return ! FIXED_VALUE_NEGATIVE (TREE_FIXED_CST (t));
14880
14881     case COND_EXPR:
14882       return (tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
14883                                              strict_overflow_p)
14884               && tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 2),
14885                                                 strict_overflow_p));
14886     default:
14887       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
14888                                                    TREE_TYPE (t));
14889     }
14890   /* We don't know sign of `t', so be conservative and return false.  */
14891   return false;
14892 }
14893
14894 /* Return true if T is known to be non-negative.  If the return
14895    value is based on the assumption that signed overflow is undefined,
14896    set *STRICT_OVERFLOW_P to true; otherwise, don't change
14897    *STRICT_OVERFLOW_P.  */
14898
14899 bool
14900 tree_call_nonnegative_warnv_p (tree type, tree fndecl,
14901                                tree arg0, tree arg1, bool *strict_overflow_p)
14902 {
14903   if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
14904     switch (DECL_FUNCTION_CODE (fndecl))
14905       {
14906         CASE_FLT_FN (BUILT_IN_ACOS):
14907         CASE_FLT_FN (BUILT_IN_ACOSH):
14908         CASE_FLT_FN (BUILT_IN_CABS):
14909         CASE_FLT_FN (BUILT_IN_COSH):
14910         CASE_FLT_FN (BUILT_IN_ERFC):
14911         CASE_FLT_FN (BUILT_IN_EXP):
14912         CASE_FLT_FN (BUILT_IN_EXP10):
14913         CASE_FLT_FN (BUILT_IN_EXP2):
14914         CASE_FLT_FN (BUILT_IN_FABS):
14915         CASE_FLT_FN (BUILT_IN_FDIM):
14916         CASE_FLT_FN (BUILT_IN_HYPOT):
14917         CASE_FLT_FN (BUILT_IN_POW10):
14918         CASE_INT_FN (BUILT_IN_FFS):
14919         CASE_INT_FN (BUILT_IN_PARITY):
14920         CASE_INT_FN (BUILT_IN_POPCOUNT):
14921         CASE_INT_FN (BUILT_IN_CLZ):
14922         CASE_INT_FN (BUILT_IN_CLRSB):
14923       case BUILT_IN_BSWAP32:
14924       case BUILT_IN_BSWAP64:
14925         /* Always true.  */
14926         return true;
14927
14928         CASE_FLT_FN (BUILT_IN_SQRT):
14929         /* sqrt(-0.0) is -0.0.  */
14930         if (!HONOR_SIGNED_ZEROS (element_mode (type)))
14931           return true;
14932         return tree_expr_nonnegative_warnv_p (arg0,
14933                                               strict_overflow_p);
14934
14935         CASE_FLT_FN (BUILT_IN_ASINH):
14936         CASE_FLT_FN (BUILT_IN_ATAN):
14937         CASE_FLT_FN (BUILT_IN_ATANH):
14938         CASE_FLT_FN (BUILT_IN_CBRT):
14939         CASE_FLT_FN (BUILT_IN_CEIL):
14940         CASE_FLT_FN (BUILT_IN_ERF):
14941         CASE_FLT_FN (BUILT_IN_EXPM1):
14942         CASE_FLT_FN (BUILT_IN_FLOOR):
14943         CASE_FLT_FN (BUILT_IN_FMOD):
14944         CASE_FLT_FN (BUILT_IN_FREXP):
14945         CASE_FLT_FN (BUILT_IN_ICEIL):
14946         CASE_FLT_FN (BUILT_IN_IFLOOR):
14947         CASE_FLT_FN (BUILT_IN_IRINT):
14948         CASE_FLT_FN (BUILT_IN_IROUND):
14949         CASE_FLT_FN (BUILT_IN_LCEIL):
14950         CASE_FLT_FN (BUILT_IN_LDEXP):
14951         CASE_FLT_FN (BUILT_IN_LFLOOR):
14952         CASE_FLT_FN (BUILT_IN_LLCEIL):
14953         CASE_FLT_FN (BUILT_IN_LLFLOOR):
14954         CASE_FLT_FN (BUILT_IN_LLRINT):
14955         CASE_FLT_FN (BUILT_IN_LLROUND):
14956         CASE_FLT_FN (BUILT_IN_LRINT):
14957         CASE_FLT_FN (BUILT_IN_LROUND):
14958         CASE_FLT_FN (BUILT_IN_MODF):
14959         CASE_FLT_FN (BUILT_IN_NEARBYINT):
14960         CASE_FLT_FN (BUILT_IN_RINT):
14961         CASE_FLT_FN (BUILT_IN_ROUND):
14962         CASE_FLT_FN (BUILT_IN_SCALB):
14963         CASE_FLT_FN (BUILT_IN_SCALBLN):
14964         CASE_FLT_FN (BUILT_IN_SCALBN):
14965         CASE_FLT_FN (BUILT_IN_SIGNBIT):
14966         CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
14967         CASE_FLT_FN (BUILT_IN_SINH):
14968         CASE_FLT_FN (BUILT_IN_TANH):
14969         CASE_FLT_FN (BUILT_IN_TRUNC):
14970         /* True if the 1st argument is nonnegative.  */
14971         return tree_expr_nonnegative_warnv_p (arg0,
14972                                               strict_overflow_p);
14973
14974         CASE_FLT_FN (BUILT_IN_FMAX):
14975         /* True if the 1st OR 2nd arguments are nonnegative.  */
14976         return (tree_expr_nonnegative_warnv_p (arg0,
14977                                                strict_overflow_p)
14978                 || (tree_expr_nonnegative_warnv_p (arg1,
14979                                                    strict_overflow_p)));
14980
14981         CASE_FLT_FN (BUILT_IN_FMIN):
14982         /* True if the 1st AND 2nd arguments are nonnegative.  */
14983         return (tree_expr_nonnegative_warnv_p (arg0,
14984                                                strict_overflow_p)
14985                 && (tree_expr_nonnegative_warnv_p (arg1,
14986                                                    strict_overflow_p)));
14987
14988         CASE_FLT_FN (BUILT_IN_COPYSIGN):
14989         /* True if the 2nd argument is nonnegative.  */
14990         return tree_expr_nonnegative_warnv_p (arg1,
14991                                               strict_overflow_p);
14992
14993         CASE_FLT_FN (BUILT_IN_POWI):
14994         /* True if the 1st argument is nonnegative or the second
14995            argument is an even integer.  */
14996         if (TREE_CODE (arg1) == INTEGER_CST
14997             && (TREE_INT_CST_LOW (arg1) & 1) == 0)
14998           return true;
14999         return tree_expr_nonnegative_warnv_p (arg0,
15000                                               strict_overflow_p);
15001
15002         CASE_FLT_FN (BUILT_IN_POW):
15003         /* True if the 1st argument is nonnegative or the second
15004            argument is an even integer valued real.  */
15005         if (TREE_CODE (arg1) == REAL_CST)
15006           {
15007             REAL_VALUE_TYPE c;
15008             HOST_WIDE_INT n;
15009
15010             c = TREE_REAL_CST (arg1);
15011             n = real_to_integer (&c);
15012             if ((n & 1) == 0)
15013               {
15014                 REAL_VALUE_TYPE cint;
15015                 real_from_integer (&cint, VOIDmode, n, SIGNED);
15016                 if (real_identical (&c, &cint))
15017                   return true;
15018               }
15019           }
15020         return tree_expr_nonnegative_warnv_p (arg0,
15021                                               strict_overflow_p);
15022
15023       default:
15024         break;
15025       }
15026   return tree_simple_nonnegative_warnv_p (CALL_EXPR,
15027                                           type);
15028 }
15029
15030 /* Return true if T is known to be non-negative.  If the return
15031    value is based on the assumption that signed overflow is undefined,
15032    set *STRICT_OVERFLOW_P to true; otherwise, don't change
15033    *STRICT_OVERFLOW_P.  */
15034
15035 static bool
15036 tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15037 {
15038   enum tree_code code = TREE_CODE (t);
15039   if (TYPE_UNSIGNED (TREE_TYPE (t)))
15040     return true;
15041
15042   switch (code)
15043     {
15044     case TARGET_EXPR:
15045       {
15046         tree temp = TARGET_EXPR_SLOT (t);
15047         t = TARGET_EXPR_INITIAL (t);
15048
15049         /* If the initializer is non-void, then it's a normal expression
15050            that will be assigned to the slot.  */
15051         if (!VOID_TYPE_P (t))
15052           return tree_expr_nonnegative_warnv_p (t, strict_overflow_p);
15053
15054         /* Otherwise, the initializer sets the slot in some way.  One common
15055            way is an assignment statement at the end of the initializer.  */
15056         while (1)
15057           {
15058             if (TREE_CODE (t) == BIND_EXPR)
15059               t = expr_last (BIND_EXPR_BODY (t));
15060             else if (TREE_CODE (t) == TRY_FINALLY_EXPR
15061                      || TREE_CODE (t) == TRY_CATCH_EXPR)
15062               t = expr_last (TREE_OPERAND (t, 0));
15063             else if (TREE_CODE (t) == STATEMENT_LIST)
15064               t = expr_last (t);
15065             else
15066               break;
15067           }
15068         if (TREE_CODE (t) == MODIFY_EXPR
15069             && TREE_OPERAND (t, 0) == temp)
15070           return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15071                                                 strict_overflow_p);
15072
15073         return false;
15074       }
15075
15076     case CALL_EXPR:
15077       {
15078         tree arg0 = call_expr_nargs (t) > 0 ?  CALL_EXPR_ARG (t, 0) : NULL_TREE;
15079         tree arg1 = call_expr_nargs (t) > 1 ?  CALL_EXPR_ARG (t, 1) : NULL_TREE;
15080
15081         return tree_call_nonnegative_warnv_p (TREE_TYPE (t),
15082                                               get_callee_fndecl (t),
15083                                               arg0,
15084                                               arg1,
15085                                               strict_overflow_p);
15086       }
15087     case COMPOUND_EXPR:
15088     case MODIFY_EXPR:
15089       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 1),
15090                                             strict_overflow_p);
15091     case BIND_EXPR:
15092       return tree_expr_nonnegative_warnv_p (expr_last (TREE_OPERAND (t, 1)),
15093                                             strict_overflow_p);
15094     case SAVE_EXPR:
15095       return tree_expr_nonnegative_warnv_p (TREE_OPERAND (t, 0),
15096                                             strict_overflow_p);
15097
15098     default:
15099       return tree_simple_nonnegative_warnv_p (TREE_CODE (t),
15100                                                    TREE_TYPE (t));
15101     }
15102
15103   /* We don't know sign of `t', so be conservative and return false.  */
15104   return false;
15105 }
15106
15107 /* Return true if T is known to be non-negative.  If the return
15108    value is based on the assumption that signed overflow is undefined,
15109    set *STRICT_OVERFLOW_P to true; otherwise, don't change
15110    *STRICT_OVERFLOW_P.  */
15111
15112 bool
15113 tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p)
15114 {
15115   enum tree_code code;
15116   if (t == error_mark_node)
15117     return false;
15118
15119   code = TREE_CODE (t);
15120   switch (TREE_CODE_CLASS (code))
15121     {
15122     case tcc_binary:
15123     case tcc_comparison:
15124       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
15125                                               TREE_TYPE (t),
15126                                               TREE_OPERAND (t, 0),
15127                                               TREE_OPERAND (t, 1),
15128                                               strict_overflow_p);
15129
15130     case tcc_unary:
15131       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
15132                                              TREE_TYPE (t),
15133                                              TREE_OPERAND (t, 0),
15134                                              strict_overflow_p);
15135
15136     case tcc_constant:
15137     case tcc_declaration:
15138     case tcc_reference:
15139       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
15140
15141     default:
15142       break;
15143     }
15144
15145   switch (code)
15146     {
15147     case TRUTH_AND_EXPR:
15148     case TRUTH_OR_EXPR:
15149     case TRUTH_XOR_EXPR:
15150       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
15151                                               TREE_TYPE (t),
15152                                               TREE_OPERAND (t, 0),
15153                                               TREE_OPERAND (t, 1),
15154                                               strict_overflow_p);
15155     case TRUTH_NOT_EXPR:
15156       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
15157                                              TREE_TYPE (t),
15158                                              TREE_OPERAND (t, 0),
15159                                              strict_overflow_p);
15160
15161     case COND_EXPR:
15162     case CONSTRUCTOR:
15163     case OBJ_TYPE_REF:
15164     case ASSERT_EXPR:
15165     case ADDR_EXPR:
15166     case WITH_SIZE_EXPR:
15167     case SSA_NAME:
15168       return tree_single_nonnegative_warnv_p (t, strict_overflow_p);
15169
15170     default:
15171       return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p);
15172     }
15173 }
15174
15175 /* Return true if `t' is known to be non-negative.  Handle warnings
15176    about undefined signed overflow.  */
15177
15178 bool
15179 tree_expr_nonnegative_p (tree t)
15180 {
15181   bool ret, strict_overflow_p;
15182
15183   strict_overflow_p = false;
15184   ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
15185   if (strict_overflow_p)
15186     fold_overflow_warning (("assuming signed overflow does not occur when "
15187                             "determining that expression is always "
15188                             "non-negative"),
15189                            WARN_STRICT_OVERFLOW_MISC);
15190   return ret;
15191 }
15192
15193
15194 /* Return true when (CODE OP0) is an address and is known to be nonzero.
15195    For floating point we further ensure that T is not denormal.
15196    Similar logic is present in nonzero_address in rtlanal.h.
15197
15198    If the return value is based on the assumption that signed overflow
15199    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15200    change *STRICT_OVERFLOW_P.  */
15201
15202 bool
15203 tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0,
15204                                  bool *strict_overflow_p)
15205 {
15206   switch (code)
15207     {
15208     case ABS_EXPR:
15209       return tree_expr_nonzero_warnv_p (op0,
15210                                         strict_overflow_p);
15211
15212     case NOP_EXPR:
15213       {
15214         tree inner_type = TREE_TYPE (op0);
15215         tree outer_type = type;
15216
15217         return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
15218                 && tree_expr_nonzero_warnv_p (op0,
15219                                               strict_overflow_p));
15220       }
15221       break;
15222
15223     case NON_LVALUE_EXPR:
15224       return tree_expr_nonzero_warnv_p (op0,
15225                                         strict_overflow_p);
15226
15227     default:
15228       break;
15229   }
15230
15231   return false;
15232 }
15233
15234 /* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
15235    For floating point we further ensure that T is not denormal.
15236    Similar logic is present in nonzero_address in rtlanal.h.
15237
15238    If the return value is based on the assumption that signed overflow
15239    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15240    change *STRICT_OVERFLOW_P.  */
15241
15242 bool
15243 tree_binary_nonzero_warnv_p (enum tree_code code,
15244                              tree type,
15245                              tree op0,
15246                              tree op1, bool *strict_overflow_p)
15247 {
15248   bool sub_strict_overflow_p;
15249   switch (code)
15250     {
15251     case POINTER_PLUS_EXPR:
15252     case PLUS_EXPR:
15253       if (ANY_INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_UNDEFINED (type))
15254         {
15255           /* With the presence of negative values it is hard
15256              to say something.  */
15257           sub_strict_overflow_p = false;
15258           if (!tree_expr_nonnegative_warnv_p (op0,
15259                                               &sub_strict_overflow_p)
15260               || !tree_expr_nonnegative_warnv_p (op1,
15261                                                  &sub_strict_overflow_p))
15262             return false;
15263           /* One of operands must be positive and the other non-negative.  */
15264           /* We don't set *STRICT_OVERFLOW_P here: even if this value
15265              overflows, on a twos-complement machine the sum of two
15266              nonnegative numbers can never be zero.  */
15267           return (tree_expr_nonzero_warnv_p (op0,
15268                                              strict_overflow_p)
15269                   || tree_expr_nonzero_warnv_p (op1,
15270                                                 strict_overflow_p));
15271         }
15272       break;
15273
15274     case MULT_EXPR:
15275       if (TYPE_OVERFLOW_UNDEFINED (type))
15276         {
15277           if (tree_expr_nonzero_warnv_p (op0,
15278                                          strict_overflow_p)
15279               && tree_expr_nonzero_warnv_p (op1,
15280                                             strict_overflow_p))
15281             {
15282               *strict_overflow_p = true;
15283               return true;
15284             }
15285         }
15286       break;
15287
15288     case MIN_EXPR:
15289       sub_strict_overflow_p = false;
15290       if (tree_expr_nonzero_warnv_p (op0,
15291                                      &sub_strict_overflow_p)
15292           && tree_expr_nonzero_warnv_p (op1,
15293                                         &sub_strict_overflow_p))
15294         {
15295           if (sub_strict_overflow_p)
15296             *strict_overflow_p = true;
15297         }
15298       break;
15299
15300     case MAX_EXPR:
15301       sub_strict_overflow_p = false;
15302       if (tree_expr_nonzero_warnv_p (op0,
15303                                      &sub_strict_overflow_p))
15304         {
15305           if (sub_strict_overflow_p)
15306             *strict_overflow_p = true;
15307
15308           /* When both operands are nonzero, then MAX must be too.  */
15309           if (tree_expr_nonzero_warnv_p (op1,
15310                                          strict_overflow_p))
15311             return true;
15312
15313           /* MAX where operand 0 is positive is positive.  */
15314           return tree_expr_nonnegative_warnv_p (op0,
15315                                                strict_overflow_p);
15316         }
15317       /* MAX where operand 1 is positive is positive.  */
15318       else if (tree_expr_nonzero_warnv_p (op1,
15319                                           &sub_strict_overflow_p)
15320                && tree_expr_nonnegative_warnv_p (op1,
15321                                                  &sub_strict_overflow_p))
15322         {
15323           if (sub_strict_overflow_p)
15324             *strict_overflow_p = true;
15325           return true;
15326         }
15327       break;
15328
15329     case BIT_IOR_EXPR:
15330       return (tree_expr_nonzero_warnv_p (op1,
15331                                          strict_overflow_p)
15332               || tree_expr_nonzero_warnv_p (op0,
15333                                             strict_overflow_p));
15334
15335     default:
15336       break;
15337   }
15338
15339   return false;
15340 }
15341
15342 /* Return true when T is an address and is known to be nonzero.
15343    For floating point we further ensure that T is not denormal.
15344    Similar logic is present in nonzero_address in rtlanal.h.
15345
15346    If the return value is based on the assumption that signed overflow
15347    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
15348    change *STRICT_OVERFLOW_P.  */
15349
15350 bool
15351 tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
15352 {
15353   bool sub_strict_overflow_p;
15354   switch (TREE_CODE (t))
15355     {
15356     case INTEGER_CST:
15357       return !integer_zerop (t);
15358
15359     case ADDR_EXPR:
15360       {
15361         tree base = TREE_OPERAND (t, 0);
15362
15363         if (!DECL_P (base))
15364           base = get_base_address (base);
15365
15366         if (!base)
15367           return false;
15368
15369         /* For objects in symbol table check if we know they are non-zero.
15370            Don't do anything for variables and functions before symtab is built;
15371            it is quite possible that they will be declared weak later.  */
15372         if (DECL_P (base) && decl_in_symtab_p (base))
15373           {
15374             struct symtab_node *symbol;
15375
15376             symbol = symtab_node::get_create (base);
15377             if (symbol)
15378               return symbol->nonzero_address ();
15379             else
15380               return false;
15381           }
15382
15383         /* Function local objects are never NULL.  */
15384         if (DECL_P (base)
15385             && (DECL_CONTEXT (base)
15386                 && TREE_CODE (DECL_CONTEXT (base)) == FUNCTION_DECL
15387                 && auto_var_in_fn_p (base, DECL_CONTEXT (base))))
15388           return true;
15389
15390         /* Constants are never weak.  */
15391         if (CONSTANT_CLASS_P (base))
15392           return true;
15393
15394         return false;
15395       }
15396
15397     case COND_EXPR:
15398       sub_strict_overflow_p = false;
15399       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
15400                                      &sub_strict_overflow_p)
15401           && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
15402                                         &sub_strict_overflow_p))
15403         {
15404           if (sub_strict_overflow_p)
15405             *strict_overflow_p = true;
15406           return true;
15407         }
15408       break;
15409
15410     default:
15411       break;
15412     }
15413   return false;
15414 }
15415
15416 /* Given the components of a binary expression CODE, TYPE, OP0 and OP1,
15417    attempt to fold the expression to a constant without modifying TYPE,
15418    OP0 or OP1.
15419
15420    If the expression could be simplified to a constant, then return
15421    the constant.  If the expression would not be simplified to a
15422    constant, then return NULL_TREE.  */
15423
15424 tree
15425 fold_binary_to_constant (enum tree_code code, tree type, tree op0, tree op1)
15426 {
15427   tree tem = fold_binary (code, type, op0, op1);
15428   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
15429 }
15430
15431 /* Given the components of a unary expression CODE, TYPE and OP0,
15432    attempt to fold the expression to a constant without modifying
15433    TYPE or OP0.
15434
15435    If the expression could be simplified to a constant, then return
15436    the constant.  If the expression would not be simplified to a
15437    constant, then return NULL_TREE.  */
15438
15439 tree
15440 fold_unary_to_constant (enum tree_code code, tree type, tree op0)
15441 {
15442   tree tem = fold_unary (code, type, op0);
15443   return (tem && TREE_CONSTANT (tem)) ? tem : NULL_TREE;
15444 }
15445
15446 /* If EXP represents referencing an element in a constant string
15447    (either via pointer arithmetic or array indexing), return the
15448    tree representing the value accessed, otherwise return NULL.  */
15449
15450 tree
15451 fold_read_from_constant_string (tree exp)
15452 {
15453   if ((TREE_CODE (exp) == INDIRECT_REF
15454        || TREE_CODE (exp) == ARRAY_REF)
15455       && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE)
15456     {
15457       tree exp1 = TREE_OPERAND (exp, 0);
15458       tree index;
15459       tree string;
15460       location_t loc = EXPR_LOCATION (exp);
15461
15462       if (TREE_CODE (exp) == INDIRECT_REF)
15463         string = string_constant (exp1, &index);
15464       else
15465         {
15466           tree low_bound = array_ref_low_bound (exp);
15467           index = fold_convert_loc (loc, sizetype, TREE_OPERAND (exp, 1));
15468
15469           /* Optimize the special-case of a zero lower bound.
15470
15471              We convert the low_bound to sizetype to avoid some problems
15472              with constant folding.  (E.g. suppose the lower bound is 1,
15473              and its mode is QI.  Without the conversion,l (ARRAY
15474              +(INDEX-(unsigned char)1)) becomes ((ARRAY+(-(unsigned char)1))
15475              +INDEX), which becomes (ARRAY+255+INDEX).  Oops!)  */
15476           if (! integer_zerop (low_bound))
15477             index = size_diffop_loc (loc, index,
15478                                  fold_convert_loc (loc, sizetype, low_bound));
15479
15480           string = exp1;
15481         }
15482
15483       if (string
15484           && TYPE_MODE (TREE_TYPE (exp)) == TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))
15485           && TREE_CODE (string) == STRING_CST
15486           && TREE_CODE (index) == INTEGER_CST
15487           && compare_tree_int (index, TREE_STRING_LENGTH (string)) < 0
15488           && (GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (TREE_TYPE (string))))
15489               == MODE_INT)
15490           && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_TYPE (string)))) == 1))
15491         return build_int_cst_type (TREE_TYPE (exp),
15492                                    (TREE_STRING_POINTER (string)
15493                                     [TREE_INT_CST_LOW (index)]));
15494     }
15495   return NULL;
15496 }
15497
15498 /* Return the tree for neg (ARG0) when ARG0 is known to be either
15499    an integer constant, real, or fixed-point constant.
15500
15501    TYPE is the type of the result.  */
15502
15503 static tree
15504 fold_negate_const (tree arg0, tree type)
15505 {
15506   tree t = NULL_TREE;
15507
15508   switch (TREE_CODE (arg0))
15509     {
15510     case INTEGER_CST:
15511       {
15512         bool overflow;
15513         wide_int val = wi::neg (arg0, &overflow);
15514         t = force_fit_type (type, val, 1,
15515                             (overflow | TREE_OVERFLOW (arg0))
15516                             && !TYPE_UNSIGNED (type));
15517         break;
15518       }
15519
15520     case REAL_CST:
15521       t = build_real (type, real_value_negate (&TREE_REAL_CST (arg0)));
15522       break;
15523
15524     case FIXED_CST:
15525       {
15526         FIXED_VALUE_TYPE f;
15527         bool overflow_p = fixed_arithmetic (&f, NEGATE_EXPR,
15528                                             &(TREE_FIXED_CST (arg0)), NULL,
15529                                             TYPE_SATURATING (type));
15530         t = build_fixed (type, f);
15531         /* Propagate overflow flags.  */
15532         if (overflow_p | TREE_OVERFLOW (arg0))
15533           TREE_OVERFLOW (t) = 1;
15534         break;
15535       }
15536
15537     default:
15538       gcc_unreachable ();
15539     }
15540
15541   return t;
15542 }
15543
15544 /* Return the tree for abs (ARG0) when ARG0 is known to be either
15545    an integer constant or real constant.
15546
15547    TYPE is the type of the result.  */
15548
15549 tree
15550 fold_abs_const (tree arg0, tree type)
15551 {
15552   tree t = NULL_TREE;
15553
15554   switch (TREE_CODE (arg0))
15555     {
15556     case INTEGER_CST:
15557       {
15558         /* If the value is unsigned or non-negative, then the absolute value
15559            is the same as the ordinary value.  */
15560         if (!wi::neg_p (arg0, TYPE_SIGN (type)))
15561           t = arg0;
15562
15563         /* If the value is negative, then the absolute value is
15564            its negation.  */
15565         else
15566           {
15567             bool overflow;
15568             wide_int val = wi::neg (arg0, &overflow);
15569             t = force_fit_type (type, val, -1,
15570                                 overflow | TREE_OVERFLOW (arg0));
15571           }
15572       }
15573       break;
15574
15575     case REAL_CST:
15576       if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg0)))
15577         t = build_real (type, real_value_negate (&TREE_REAL_CST (arg0)));
15578       else
15579         t =  arg0;
15580       break;
15581
15582     default:
15583       gcc_unreachable ();
15584     }
15585
15586   return t;
15587 }
15588
15589 /* Return the tree for not (ARG0) when ARG0 is known to be an integer
15590    constant.  TYPE is the type of the result.  */
15591
15592 static tree
15593 fold_not_const (const_tree arg0, tree type)
15594 {
15595   gcc_assert (TREE_CODE (arg0) == INTEGER_CST);
15596
15597   return force_fit_type (type, wi::bit_not (arg0), 0, TREE_OVERFLOW (arg0));
15598 }
15599
15600 /* Given CODE, a relational operator, the target type, TYPE and two
15601    constant operands OP0 and OP1, return the result of the
15602    relational operation.  If the result is not a compile time
15603    constant, then return NULL_TREE.  */
15604
15605 static tree
15606 fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
15607 {
15608   int result, invert;
15609
15610   /* From here on, the only cases we handle are when the result is
15611      known to be a constant.  */
15612
15613   if (TREE_CODE (op0) == REAL_CST && TREE_CODE (op1) == REAL_CST)
15614     {
15615       const REAL_VALUE_TYPE *c0 = TREE_REAL_CST_PTR (op0);
15616       const REAL_VALUE_TYPE *c1 = TREE_REAL_CST_PTR (op1);
15617
15618       /* Handle the cases where either operand is a NaN.  */
15619       if (real_isnan (c0) || real_isnan (c1))
15620         {
15621           switch (code)
15622             {
15623             case EQ_EXPR:
15624             case ORDERED_EXPR:
15625               result = 0;
15626               break;
15627
15628             case NE_EXPR:
15629             case UNORDERED_EXPR:
15630             case UNLT_EXPR:
15631             case UNLE_EXPR:
15632             case UNGT_EXPR:
15633             case UNGE_EXPR:
15634             case UNEQ_EXPR:
15635               result = 1;
15636               break;
15637
15638             case LT_EXPR:
15639             case LE_EXPR:
15640             case GT_EXPR:
15641             case GE_EXPR:
15642             case LTGT_EXPR:
15643               if (flag_trapping_math)
15644                 return NULL_TREE;
15645               result = 0;
15646               break;
15647
15648             default:
15649               gcc_unreachable ();
15650             }
15651
15652           return constant_boolean_node (result, type);
15653         }
15654
15655       return constant_boolean_node (real_compare (code, c0, c1), type);
15656     }
15657
15658   if (TREE_CODE (op0) == FIXED_CST && TREE_CODE (op1) == FIXED_CST)
15659     {
15660       const FIXED_VALUE_TYPE *c0 = TREE_FIXED_CST_PTR (op0);
15661       const FIXED_VALUE_TYPE *c1 = TREE_FIXED_CST_PTR (op1);
15662       return constant_boolean_node (fixed_compare (code, c0, c1), type);
15663     }
15664
15665   /* Handle equality/inequality of complex constants.  */
15666   if (TREE_CODE (op0) == COMPLEX_CST && TREE_CODE (op1) == COMPLEX_CST)
15667     {
15668       tree rcond = fold_relational_const (code, type,
15669                                           TREE_REALPART (op0),
15670                                           TREE_REALPART (op1));
15671       tree icond = fold_relational_const (code, type,
15672                                           TREE_IMAGPART (op0),
15673                                           TREE_IMAGPART (op1));
15674       if (code == EQ_EXPR)
15675         return fold_build2 (TRUTH_ANDIF_EXPR, type, rcond, icond);
15676       else if (code == NE_EXPR)
15677         return fold_build2 (TRUTH_ORIF_EXPR, type, rcond, icond);
15678       else
15679         return NULL_TREE;
15680     }
15681
15682   if (TREE_CODE (op0) == VECTOR_CST && TREE_CODE (op1) == VECTOR_CST)
15683     {
15684       unsigned count = VECTOR_CST_NELTS (op0);
15685       tree *elts =  XALLOCAVEC (tree, count);
15686       gcc_assert (VECTOR_CST_NELTS (op1) == count
15687                   && TYPE_VECTOR_SUBPARTS (type) == count);
15688
15689       for (unsigned i = 0; i < count; i++)
15690         {
15691           tree elem_type = TREE_TYPE (type);
15692           tree elem0 = VECTOR_CST_ELT (op0, i);
15693           tree elem1 = VECTOR_CST_ELT (op1, i);
15694
15695           tree tem = fold_relational_const (code, elem_type,
15696                                             elem0, elem1);
15697
15698           if (tem == NULL_TREE)
15699             return NULL_TREE;
15700
15701           elts[i] = build_int_cst (elem_type, integer_zerop (tem) ? 0 : -1);
15702         }
15703
15704       return build_vector (type, elts);
15705     }
15706
15707   /* From here on we only handle LT, LE, GT, GE, EQ and NE.
15708
15709      To compute GT, swap the arguments and do LT.
15710      To compute GE, do LT and invert the result.
15711      To compute LE, swap the arguments, do LT and invert the result.
15712      To compute NE, do EQ and invert the result.
15713
15714      Therefore, the code below must handle only EQ and LT.  */
15715
15716   if (code == LE_EXPR || code == GT_EXPR)
15717     {
15718       tree tem = op0;
15719       op0 = op1;
15720       op1 = tem;
15721       code = swap_tree_comparison (code);
15722     }
15723
15724   /* Note that it is safe to invert for real values here because we
15725      have already handled the one case that it matters.  */
15726
15727   invert = 0;
15728   if (code == NE_EXPR || code == GE_EXPR)
15729     {
15730       invert = 1;
15731       code = invert_tree_comparison (code, false);
15732     }
15733
15734   /* Compute a result for LT or EQ if args permit;
15735      Otherwise return T.  */
15736   if (TREE_CODE (op0) == INTEGER_CST && TREE_CODE (op1) == INTEGER_CST)
15737     {
15738       if (code == EQ_EXPR)
15739         result = tree_int_cst_equal (op0, op1);
15740       else
15741         result = tree_int_cst_lt (op0, op1);
15742     }
15743   else
15744     return NULL_TREE;
15745
15746   if (invert)
15747     result ^= 1;
15748   return constant_boolean_node (result, type);
15749 }
15750
15751 /* If necessary, return a CLEANUP_POINT_EXPR for EXPR with the
15752    indicated TYPE.  If no CLEANUP_POINT_EXPR is necessary, return EXPR
15753    itself.  */
15754
15755 tree
15756 fold_build_cleanup_point_expr (tree type, tree expr)
15757 {
15758   /* If the expression does not have side effects then we don't have to wrap
15759      it with a cleanup point expression.  */
15760   if (!TREE_SIDE_EFFECTS (expr))
15761     return expr;
15762
15763   /* If the expression is a return, check to see if the expression inside the
15764      return has no side effects or the right hand side of the modify expression
15765      inside the return. If either don't have side effects set we don't need to
15766      wrap the expression in a cleanup point expression.  Note we don't check the
15767      left hand side of the modify because it should always be a return decl.  */
15768   if (TREE_CODE (expr) == RETURN_EXPR)
15769     {
15770       tree op = TREE_OPERAND (expr, 0);
15771       if (!op || !TREE_SIDE_EFFECTS (op))
15772         return expr;
15773       op = TREE_OPERAND (op, 1);
15774       if (!TREE_SIDE_EFFECTS (op))
15775         return expr;
15776     }
15777
15778   return build1 (CLEANUP_POINT_EXPR, type, expr);
15779 }
15780
15781 /* Given a pointer value OP0 and a type TYPE, return a simplified version
15782    of an indirection through OP0, or NULL_TREE if no simplification is
15783    possible.  */
15784
15785 tree
15786 fold_indirect_ref_1 (location_t loc, tree type, tree op0)
15787 {
15788   tree sub = op0;
15789   tree subtype;
15790
15791   STRIP_NOPS (sub);
15792   subtype = TREE_TYPE (sub);
15793   if (!POINTER_TYPE_P (subtype))
15794     return NULL_TREE;
15795
15796   if (TREE_CODE (sub) == ADDR_EXPR)
15797     {
15798       tree op = TREE_OPERAND (sub, 0);
15799       tree optype = TREE_TYPE (op);
15800       /* *&CONST_DECL -> to the value of the const decl.  */
15801       if (TREE_CODE (op) == CONST_DECL)
15802         return DECL_INITIAL (op);
15803       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
15804       if (type == optype)
15805         {
15806           tree fop = fold_read_from_constant_string (op);
15807           if (fop)
15808             return fop;
15809           else
15810             return op;
15811         }
15812       /* *(foo *)&fooarray => fooarray[0] */
15813       else if (TREE_CODE (optype) == ARRAY_TYPE
15814                && type == TREE_TYPE (optype)
15815                && (!in_gimple_form
15816                    || TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST))
15817         {
15818           tree type_domain = TYPE_DOMAIN (optype);
15819           tree min_val = size_zero_node;
15820           if (type_domain && TYPE_MIN_VALUE (type_domain))
15821             min_val = TYPE_MIN_VALUE (type_domain);
15822           if (in_gimple_form
15823               && TREE_CODE (min_val) != INTEGER_CST)
15824             return NULL_TREE;
15825           return build4_loc (loc, ARRAY_REF, type, op, min_val,
15826                              NULL_TREE, NULL_TREE);
15827         }
15828       /* *(foo *)&complexfoo => __real__ complexfoo */
15829       else if (TREE_CODE (optype) == COMPLEX_TYPE
15830                && type == TREE_TYPE (optype))
15831         return fold_build1_loc (loc, REALPART_EXPR, type, op);
15832       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
15833       else if (TREE_CODE (optype) == VECTOR_TYPE
15834                && type == TREE_TYPE (optype))
15835         {
15836           tree part_width = TYPE_SIZE (type);
15837           tree index = bitsize_int (0);
15838           return fold_build3_loc (loc, BIT_FIELD_REF, type, op, part_width, index);
15839         }
15840     }
15841
15842   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
15843       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
15844     {
15845       tree op00 = TREE_OPERAND (sub, 0);
15846       tree op01 = TREE_OPERAND (sub, 1);
15847
15848       STRIP_NOPS (op00);
15849       if (TREE_CODE (op00) == ADDR_EXPR)
15850         {
15851           tree op00type;
15852           op00 = TREE_OPERAND (op00, 0);
15853           op00type = TREE_TYPE (op00);
15854
15855           /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
15856           if (TREE_CODE (op00type) == VECTOR_TYPE
15857               && type == TREE_TYPE (op00type))
15858             {
15859               HOST_WIDE_INT offset = tree_to_shwi (op01);
15860               tree part_width = TYPE_SIZE (type);
15861               unsigned HOST_WIDE_INT part_widthi = tree_to_shwi (part_width)/BITS_PER_UNIT;
15862               unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
15863               tree index = bitsize_int (indexi);
15864
15865               if (offset / part_widthi < TYPE_VECTOR_SUBPARTS (op00type))
15866                 return fold_build3_loc (loc,
15867                                         BIT_FIELD_REF, type, op00,
15868                                         part_width, index);
15869
15870             }
15871           /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
15872           else if (TREE_CODE (op00type) == COMPLEX_TYPE
15873                    && type == TREE_TYPE (op00type))
15874             {
15875               tree size = TYPE_SIZE_UNIT (type);
15876               if (tree_int_cst_equal (size, op01))
15877                 return fold_build1_loc (loc, IMAGPART_EXPR, type, op00);
15878             }
15879           /* ((foo *)&fooarray)[1] => fooarray[1] */
15880           else if (TREE_CODE (op00type) == ARRAY_TYPE
15881                    && type == TREE_TYPE (op00type))
15882             {
15883               tree type_domain = TYPE_DOMAIN (op00type);
15884               tree min_val = size_zero_node;
15885               if (type_domain && TYPE_MIN_VALUE (type_domain))
15886                 min_val = TYPE_MIN_VALUE (type_domain);
15887               op01 = size_binop_loc (loc, EXACT_DIV_EXPR, op01,
15888                                      TYPE_SIZE_UNIT (type));
15889               op01 = size_binop_loc (loc, PLUS_EXPR, op01, min_val);
15890               return build4_loc (loc, ARRAY_REF, type, op00, op01,
15891                                  NULL_TREE, NULL_TREE);
15892             }
15893         }
15894     }
15895
15896   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
15897   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
15898       && type == TREE_TYPE (TREE_TYPE (subtype))
15899       && (!in_gimple_form
15900           || TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST))
15901     {
15902       tree type_domain;
15903       tree min_val = size_zero_node;
15904       sub = build_fold_indirect_ref_loc (loc, sub);
15905       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
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, sub, min_val, NULL_TREE,
15912                          NULL_TREE);
15913     }
15914
15915   return NULL_TREE;
15916 }
15917
15918 /* Builds an expression for an indirection through T, simplifying some
15919    cases.  */
15920
15921 tree
15922 build_fold_indirect_ref_loc (location_t loc, tree t)
15923 {
15924   tree type = TREE_TYPE (TREE_TYPE (t));
15925   tree sub = fold_indirect_ref_1 (loc, type, t);
15926
15927   if (sub)
15928     return sub;
15929
15930   return build1_loc (loc, INDIRECT_REF, type, t);
15931 }
15932
15933 /* Given an INDIRECT_REF T, return either T or a simplified version.  */
15934
15935 tree
15936 fold_indirect_ref_loc (location_t loc, tree t)
15937 {
15938   tree sub = fold_indirect_ref_1 (loc, TREE_TYPE (t), TREE_OPERAND (t, 0));
15939
15940   if (sub)
15941     return sub;
15942   else
15943     return t;
15944 }
15945
15946 /* Strip non-trapping, non-side-effecting tree nodes from an expression
15947    whose result is ignored.  The type of the returned tree need not be
15948    the same as the original expression.  */
15949
15950 tree
15951 fold_ignored_result (tree t)
15952 {
15953   if (!TREE_SIDE_EFFECTS (t))
15954     return integer_zero_node;
15955
15956   for (;;)
15957     switch (TREE_CODE_CLASS (TREE_CODE (t)))
15958       {
15959       case tcc_unary:
15960         t = TREE_OPERAND (t, 0);
15961         break;
15962
15963       case tcc_binary:
15964       case tcc_comparison:
15965         if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15966           t = TREE_OPERAND (t, 0);
15967         else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
15968           t = TREE_OPERAND (t, 1);
15969         else
15970           return t;
15971         break;
15972
15973       case tcc_expression:
15974         switch (TREE_CODE (t))
15975           {
15976           case COMPOUND_EXPR:
15977             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
15978               return t;
15979             t = TREE_OPERAND (t, 0);
15980             break;
15981
15982           case COND_EXPR:
15983             if (TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1))
15984                 || TREE_SIDE_EFFECTS (TREE_OPERAND (t, 2)))
15985               return t;
15986             t = TREE_OPERAND (t, 0);
15987             break;
15988
15989           default:
15990             return t;
15991           }
15992         break;
15993
15994       default:
15995         return t;
15996       }
15997 }
15998
15999 /* Return the value of VALUE, rounded up to a multiple of DIVISOR. */
16000
16001 tree
16002 round_up_loc (location_t loc, tree value, unsigned int divisor)
16003 {
16004   tree div = NULL_TREE;
16005
16006   if (divisor == 1)
16007     return value;
16008
16009   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
16010      have to do anything.  Only do this when we are not given a const,
16011      because in that case, this check is more expensive than just
16012      doing it.  */
16013   if (TREE_CODE (value) != INTEGER_CST)
16014     {
16015       div = build_int_cst (TREE_TYPE (value), divisor);
16016
16017       if (multiple_of_p (TREE_TYPE (value), value, div))
16018         return value;
16019     }
16020
16021   /* If divisor is a power of two, simplify this to bit manipulation.  */
16022   if (divisor == (divisor & -divisor))
16023     {
16024       if (TREE_CODE (value) == INTEGER_CST)
16025         {
16026           wide_int val = value;
16027           bool overflow_p;
16028
16029           if ((val & (divisor - 1)) == 0)
16030             return value;
16031
16032           overflow_p = TREE_OVERFLOW (value);
16033           val += divisor - 1;
16034           val &= - (int) divisor;
16035           if (val == 0)
16036             overflow_p = true;
16037
16038           return force_fit_type (TREE_TYPE (value), val, -1, overflow_p);
16039         }
16040       else
16041         {
16042           tree t;
16043
16044           t = build_int_cst (TREE_TYPE (value), divisor - 1);
16045           value = size_binop_loc (loc, PLUS_EXPR, value, t);
16046           t = build_int_cst (TREE_TYPE (value), - (int) divisor);
16047           value = size_binop_loc (loc, BIT_AND_EXPR, value, t);
16048         }
16049     }
16050   else
16051     {
16052       if (!div)
16053         div = build_int_cst (TREE_TYPE (value), divisor);
16054       value = size_binop_loc (loc, CEIL_DIV_EXPR, value, div);
16055       value = size_binop_loc (loc, MULT_EXPR, value, div);
16056     }
16057
16058   return value;
16059 }
16060
16061 /* Likewise, but round down.  */
16062
16063 tree
16064 round_down_loc (location_t loc, tree value, int divisor)
16065 {
16066   tree div = NULL_TREE;
16067
16068   gcc_assert (divisor > 0);
16069   if (divisor == 1)
16070     return value;
16071
16072   /* See if VALUE is already a multiple of DIVISOR.  If so, we don't
16073      have to do anything.  Only do this when we are not given a const,
16074      because in that case, this check is more expensive than just
16075      doing it.  */
16076   if (TREE_CODE (value) != INTEGER_CST)
16077     {
16078       div = build_int_cst (TREE_TYPE (value), divisor);
16079
16080       if (multiple_of_p (TREE_TYPE (value), value, div))
16081         return value;
16082     }
16083
16084   /* If divisor is a power of two, simplify this to bit manipulation.  */
16085   if (divisor == (divisor & -divisor))
16086     {
16087       tree t;
16088
16089       t = build_int_cst (TREE_TYPE (value), -divisor);
16090       value = size_binop_loc (loc, BIT_AND_EXPR, value, t);
16091     }
16092   else
16093     {
16094       if (!div)
16095         div = build_int_cst (TREE_TYPE (value), divisor);
16096       value = size_binop_loc (loc, FLOOR_DIV_EXPR, value, div);
16097       value = size_binop_loc (loc, MULT_EXPR, value, div);
16098     }
16099
16100   return value;
16101 }
16102
16103 /* Returns the pointer to the base of the object addressed by EXP and
16104    extracts the information about the offset of the access, storing it
16105    to PBITPOS and POFFSET.  */
16106
16107 static tree
16108 split_address_to_core_and_offset (tree exp,
16109                                   HOST_WIDE_INT *pbitpos, tree *poffset)
16110 {
16111   tree core;
16112   machine_mode mode;
16113   int unsignedp, volatilep;
16114   HOST_WIDE_INT bitsize;
16115   location_t loc = EXPR_LOCATION (exp);
16116
16117   if (TREE_CODE (exp) == ADDR_EXPR)
16118     {
16119       core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
16120                                   poffset, &mode, &unsignedp, &volatilep,
16121                                   false);
16122       core = build_fold_addr_expr_loc (loc, core);
16123     }
16124   else
16125     {
16126       core = exp;
16127       *pbitpos = 0;
16128       *poffset = NULL_TREE;
16129     }
16130
16131   return core;
16132 }
16133
16134 /* Returns true if addresses of E1 and E2 differ by a constant, false
16135    otherwise.  If they do, E1 - E2 is stored in *DIFF.  */
16136
16137 bool
16138 ptr_difference_const (tree e1, tree e2, HOST_WIDE_INT *diff)
16139 {
16140   tree core1, core2;
16141   HOST_WIDE_INT bitpos1, bitpos2;
16142   tree toffset1, toffset2, tdiff, type;
16143
16144   core1 = split_address_to_core_and_offset (e1, &bitpos1, &toffset1);
16145   core2 = split_address_to_core_and_offset (e2, &bitpos2, &toffset2);
16146
16147   if (bitpos1 % BITS_PER_UNIT != 0
16148       || bitpos2 % BITS_PER_UNIT != 0
16149       || !operand_equal_p (core1, core2, 0))
16150     return false;
16151
16152   if (toffset1 && toffset2)
16153     {
16154       type = TREE_TYPE (toffset1);
16155       if (type != TREE_TYPE (toffset2))
16156         toffset2 = fold_convert (type, toffset2);
16157
16158       tdiff = fold_build2 (MINUS_EXPR, type, toffset1, toffset2);
16159       if (!cst_and_fits_in_hwi (tdiff))
16160         return false;
16161
16162       *diff = int_cst_value (tdiff);
16163     }
16164   else if (toffset1 || toffset2)
16165     {
16166       /* If only one of the offsets is non-constant, the difference cannot
16167          be a constant.  */
16168       return false;
16169     }
16170   else
16171     *diff = 0;
16172
16173   *diff += (bitpos1 - bitpos2) / BITS_PER_UNIT;
16174   return true;
16175 }
16176
16177 /* Simplify the floating point expression EXP when the sign of the
16178    result is not significant.  Return NULL_TREE if no simplification
16179    is possible.  */
16180
16181 tree
16182 fold_strip_sign_ops (tree exp)
16183 {
16184   tree arg0, arg1;
16185   location_t loc = EXPR_LOCATION (exp);
16186
16187   switch (TREE_CODE (exp))
16188     {
16189     case ABS_EXPR:
16190     case NEGATE_EXPR:
16191       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
16192       return arg0 ? arg0 : TREE_OPERAND (exp, 0);
16193
16194     case MULT_EXPR:
16195     case RDIV_EXPR:
16196       if (HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (exp)))
16197         return NULL_TREE;
16198       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 0));
16199       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16200       if (arg0 != NULL_TREE || arg1 != NULL_TREE)
16201         return fold_build2_loc (loc, TREE_CODE (exp), TREE_TYPE (exp),
16202                             arg0 ? arg0 : TREE_OPERAND (exp, 0),
16203                             arg1 ? arg1 : TREE_OPERAND (exp, 1));
16204       break;
16205
16206     case COMPOUND_EXPR:
16207       arg0 = TREE_OPERAND (exp, 0);
16208       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16209       if (arg1)
16210         return fold_build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (exp), arg0, arg1);
16211       break;
16212
16213     case COND_EXPR:
16214       arg0 = fold_strip_sign_ops (TREE_OPERAND (exp, 1));
16215       arg1 = fold_strip_sign_ops (TREE_OPERAND (exp, 2));
16216       if (arg0 || arg1)
16217         return fold_build3_loc (loc,
16218                             COND_EXPR, TREE_TYPE (exp), TREE_OPERAND (exp, 0),
16219                             arg0 ? arg0 : TREE_OPERAND (exp, 1),
16220                             arg1 ? arg1 : TREE_OPERAND (exp, 2));
16221       break;
16222
16223     case CALL_EXPR:
16224       {
16225         const enum built_in_function fcode = builtin_mathfn_code (exp);
16226         switch (fcode)
16227         {
16228         CASE_FLT_FN (BUILT_IN_COPYSIGN):
16229           /* Strip copysign function call, return the 1st argument. */
16230           arg0 = CALL_EXPR_ARG (exp, 0);
16231           arg1 = CALL_EXPR_ARG (exp, 1);
16232           return omit_one_operand_loc (loc, TREE_TYPE (exp), arg0, arg1);
16233
16234         default:
16235           /* Strip sign ops from the argument of "odd" math functions.  */
16236           if (negate_mathfn_p (fcode))
16237             {
16238               arg0 = fold_strip_sign_ops (CALL_EXPR_ARG (exp, 0));
16239               if (arg0)
16240                 return build_call_expr_loc (loc, get_callee_fndecl (exp), 1, arg0);
16241             }
16242           break;
16243         }
16244       }
16245       break;
16246
16247     default:
16248       break;
16249     }
16250   return NULL_TREE;
16251 }
16252
16253 /* Return OFF converted to a pointer offset type suitable as offset for
16254    POINTER_PLUS_EXPR.  Use location LOC for this conversion.  */
16255 tree
16256 convert_to_ptrofftype_loc (location_t loc, tree off)
16257 {
16258   return fold_convert_loc (loc, sizetype, off);
16259 }
16260
16261 /* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF.  */
16262 tree
16263 fold_build_pointer_plus_loc (location_t loc, tree ptr, tree off)
16264 {
16265   return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
16266                           ptr, convert_to_ptrofftype_loc (loc, off));
16267 }
16268
16269 /* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF.  */
16270 tree
16271 fold_build_pointer_plus_hwi_loc (location_t loc, tree ptr, HOST_WIDE_INT off)
16272 {
16273   return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
16274                           ptr, size_int (off));
16275 }