xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/gimple-fold.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /* Statement simplification on GIMPLE.
2    Copyright (C) 2010-2015 Free Software Foundation, Inc.
3    Split out from tree-ssa-ccp.c.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3, or (at your option) any
10 later version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "hash-set.h"
26 #include "machmode.h"
27 #include "vec.h"
28 #include "double-int.h"
29 #include "input.h"
30 #include "alias.h"
31 #include "symtab.h"
32 #include "wide-int.h"
33 #include "inchash.h"
34 #include "tree.h"
35 #include "fold-const.h"
36 #include "stringpool.h"
37 #include "hashtab.h"
38 #include "hard-reg-set.h"
39 #include "function.h"
40 #include "rtl.h"
41 #include "flags.h"
42 #include "statistics.h"
43 #include "real.h"
44 #include "fixed-value.h"
45 #include "insn-config.h"
46 #include "expmed.h"
47 #include "dojump.h"
48 #include "explow.h"
49 #include "calls.h"
50 #include "emit-rtl.h"
51 #include "varasm.h"
52 #include "stmt.h"
53 #include "expr.h"
54 #include "stor-layout.h"
55 #include "dumpfile.h"
56 #include "bitmap.h"
57 #include "predict.h"
58 #include "dominance.h"
59 #include "basic-block.h"
60 #include "tree-ssa-alias.h"
61 #include "internal-fn.h"
62 #include "gimple-fold.h"
63 #include "gimple-expr.h"
64 #include "is-a.h"
65 #include "gimple.h"
66 #include "gimplify.h"
67 #include "gimple-iterator.h"
68 #include "gimple-ssa.h"
69 #include "tree-ssanames.h"
70 #include "tree-into-ssa.h"
71 #include "tree-dfa.h"
72 #include "tree-ssa.h"
73 #include "tree-ssa-propagate.h"
74 #include "target.h"
75 #include "hash-map.h"
76 #include "plugin-api.h"
77 #include "ipa-ref.h"
78 #include "cgraph.h"
79 #include "ipa-utils.h"
80 #include "gimple-pretty-print.h"
81 #include "tree-ssa-address.h"
82 #include "langhooks.h"
83 #include "gimplify-me.h"
84 #include "dbgcnt.h"
85 #include "builtins.h"
86 #include "output.h"
87 #include "tree-eh.h"
88 #include "gimple-match.h"
89 #include "tree-phinodes.h"
90 #include "ssa-iterators.h"
91 #include "ipa-chkp.h"
92 
93 /* Return true when DECL can be referenced from current unit.
94    FROM_DECL (if non-null) specify constructor of variable DECL was taken from.
95    We can get declarations that are not possible to reference for various
96    reasons:
97 
98      1) When analyzing C++ virtual tables.
99 	C++ virtual tables do have known constructors even
100 	when they are keyed to other compilation unit.
101 	Those tables can contain pointers to methods and vars
102 	in other units.  Those methods have both STATIC and EXTERNAL
103 	set.
104      2) In WHOPR mode devirtualization might lead to reference
105 	to method that was partitioned elsehwere.
106 	In this case we have static VAR_DECL or FUNCTION_DECL
107 	that has no corresponding callgraph/varpool node
108 	declaring the body.
109      3) COMDAT functions referred by external vtables that
110         we devirtualize only during final compilation stage.
111         At this time we already decided that we will not output
112         the function body and thus we can't reference the symbol
113         directly.  */
114 
115 static bool
116 can_refer_decl_in_current_unit_p (tree decl, tree from_decl)
117 {
118   varpool_node *vnode;
119   struct cgraph_node *node;
120   symtab_node *snode;
121 
122   if (DECL_ABSTRACT_P (decl))
123     return false;
124 
125   /* We are concerned only about static/external vars and functions.  */
126   if ((!TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
127       || (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL))
128     return true;
129 
130   /* Static objects can be referred only if they was not optimized out yet.  */
131   if (!TREE_PUBLIC (decl) && !DECL_EXTERNAL (decl))
132     {
133       /* Before we start optimizing unreachable code we can be sure all
134 	 static objects are defined.  */
135       if (symtab->function_flags_ready)
136 	return true;
137       snode = symtab_node::get (decl);
138       if (!snode || !snode->definition)
139 	return false;
140       node = dyn_cast <cgraph_node *> (snode);
141       return !node || !node->global.inlined_to;
142     }
143 
144   /* We will later output the initializer, so we can refer to it.
145      So we are concerned only when DECL comes from initializer of
146      external var or var that has been optimized out.  */
147   if (!from_decl
148       || TREE_CODE (from_decl) != VAR_DECL
149       || (!DECL_EXTERNAL (from_decl)
150 	  && (vnode = varpool_node::get (from_decl)) != NULL
151 	  && vnode->definition)
152       || (flag_ltrans
153 	  && (vnode = varpool_node::get (from_decl)) != NULL
154 	  && vnode->in_other_partition))
155     return true;
156   /* We are folding reference from external vtable.  The vtable may reffer
157      to a symbol keyed to other compilation unit.  The other compilation
158      unit may be in separate DSO and the symbol may be hidden.  */
159   if (DECL_VISIBILITY_SPECIFIED (decl)
160       && DECL_EXTERNAL (decl)
161       && DECL_VISIBILITY (decl) != VISIBILITY_DEFAULT
162       && (!(snode = symtab_node::get (decl)) || !snode->in_other_partition))
163     return false;
164   /* When function is public, we always can introduce new reference.
165      Exception are the COMDAT functions where introducing a direct
166      reference imply need to include function body in the curren tunit.  */
167   if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl))
168     return true;
169   /* We have COMDAT.  We are going to check if we still have definition
170      or if the definition is going to be output in other partition.
171      Bypass this when gimplifying; all needed functions will be produced.
172 
173      As observed in PR20991 for already optimized out comdat virtual functions
174      it may be tempting to not necessarily give up because the copy will be
175      output elsewhere when corresponding vtable is output.
176      This is however not possible - ABI specify that COMDATs are output in
177      units where they are used and when the other unit was compiled with LTO
178      it is possible that vtable was kept public while the function itself
179      was privatized. */
180   if (!symtab->function_flags_ready)
181     return true;
182 
183   snode = symtab_node::get (decl);
184   if (!snode
185       || ((!snode->definition || DECL_EXTERNAL (decl))
186 	  && (!snode->in_other_partition
187 	      || (!snode->forced_by_abi && !snode->force_output))))
188     return false;
189   node = dyn_cast <cgraph_node *> (snode);
190   return !node || !node->global.inlined_to;
191 }
192 
193 /* CVAL is value taken from DECL_INITIAL of variable.  Try to transform it into
194    acceptable form for is_gimple_min_invariant.
195    FROM_DECL (if non-NULL) specify variable whose constructor contains CVAL.  */
196 
197 tree
198 canonicalize_constructor_val (tree cval, tree from_decl)
199 {
200   tree orig_cval = cval;
201   STRIP_NOPS (cval);
202   if (TREE_CODE (cval) == POINTER_PLUS_EXPR
203       && TREE_CODE (TREE_OPERAND (cval, 1)) == INTEGER_CST)
204     {
205       tree ptr = TREE_OPERAND (cval, 0);
206       if (is_gimple_min_invariant (ptr))
207 	cval = build1_loc (EXPR_LOCATION (cval),
208 			   ADDR_EXPR, TREE_TYPE (ptr),
209 			   fold_build2 (MEM_REF, TREE_TYPE (TREE_TYPE (ptr)),
210 					ptr,
211 					fold_convert (ptr_type_node,
212 						      TREE_OPERAND (cval, 1))));
213     }
214   if (TREE_CODE (cval) == ADDR_EXPR)
215     {
216       tree base = NULL_TREE;
217       if (TREE_CODE (TREE_OPERAND (cval, 0)) == COMPOUND_LITERAL_EXPR)
218 	{
219 	  base = COMPOUND_LITERAL_EXPR_DECL (TREE_OPERAND (cval, 0));
220 	  if (base)
221 	    TREE_OPERAND (cval, 0) = base;
222 	}
223       else
224 	base = get_base_address (TREE_OPERAND (cval, 0));
225       if (!base)
226 	return NULL_TREE;
227 
228       if ((TREE_CODE (base) == VAR_DECL
229 	   || TREE_CODE (base) == FUNCTION_DECL)
230 	  && !can_refer_decl_in_current_unit_p (base, from_decl))
231 	return NULL_TREE;
232       if (TREE_CODE (base) == VAR_DECL)
233 	TREE_ADDRESSABLE (base) = 1;
234       else if (TREE_CODE (base) == FUNCTION_DECL)
235 	{
236 	  /* Make sure we create a cgraph node for functions we'll reference.
237 	     They can be non-existent if the reference comes from an entry
238 	     of an external vtable for example.  */
239 	  cgraph_node::get_create (base);
240 	}
241       /* Fixup types in global initializers.  */
242       if (TREE_TYPE (TREE_TYPE (cval)) != TREE_TYPE (TREE_OPERAND (cval, 0)))
243 	cval = build_fold_addr_expr (TREE_OPERAND (cval, 0));
244 
245       if (!useless_type_conversion_p (TREE_TYPE (orig_cval), TREE_TYPE (cval)))
246 	cval = fold_convert (TREE_TYPE (orig_cval), cval);
247       return cval;
248     }
249   if (TREE_OVERFLOW_P (cval))
250     return drop_tree_overflow (cval);
251   return orig_cval;
252 }
253 
254 /* If SYM is a constant variable with known value, return the value.
255    NULL_TREE is returned otherwise.  */
256 
257 tree
258 get_symbol_constant_value (tree sym)
259 {
260   tree val = ctor_for_folding (sym);
261   if (val != error_mark_node)
262     {
263       if (val)
264 	{
265 	  val = canonicalize_constructor_val (unshare_expr (val), sym);
266 	  if (val && is_gimple_min_invariant (val))
267 	    return val;
268 	  else
269 	    return NULL_TREE;
270 	}
271       /* Variables declared 'const' without an initializer
272 	 have zero as the initializer if they may not be
273 	 overridden at link or run time.  */
274       if (!val
275           && is_gimple_reg_type (TREE_TYPE (sym)))
276 	return build_zero_cst (TREE_TYPE (sym));
277     }
278 
279   return NULL_TREE;
280 }
281 
282 
283 
284 /* Subroutine of fold_stmt.  We perform several simplifications of the
285    memory reference tree EXPR and make sure to re-gimplify them properly
286    after propagation of constant addresses.  IS_LHS is true if the
287    reference is supposed to be an lvalue.  */
288 
289 static tree
290 maybe_fold_reference (tree expr, bool is_lhs)
291 {
292   tree result;
293 
294   if ((TREE_CODE (expr) == VIEW_CONVERT_EXPR
295        || TREE_CODE (expr) == REALPART_EXPR
296        || TREE_CODE (expr) == IMAGPART_EXPR)
297       && CONSTANT_CLASS_P (TREE_OPERAND (expr, 0)))
298     return fold_unary_loc (EXPR_LOCATION (expr),
299 			   TREE_CODE (expr),
300 			   TREE_TYPE (expr),
301 			   TREE_OPERAND (expr, 0));
302   else if (TREE_CODE (expr) == BIT_FIELD_REF
303 	   && CONSTANT_CLASS_P (TREE_OPERAND (expr, 0)))
304     return fold_ternary_loc (EXPR_LOCATION (expr),
305 			     TREE_CODE (expr),
306 			     TREE_TYPE (expr),
307 			     TREE_OPERAND (expr, 0),
308 			     TREE_OPERAND (expr, 1),
309 			     TREE_OPERAND (expr, 2));
310 
311   if (!is_lhs
312       && (result = fold_const_aggregate_ref (expr))
313       && is_gimple_min_invariant (result))
314     return result;
315 
316   return NULL_TREE;
317 }
318 
319 
320 /* Attempt to fold an assignment statement pointed-to by SI.  Returns a
321    replacement rhs for the statement or NULL_TREE if no simplification
322    could be made.  It is assumed that the operands have been previously
323    folded.  */
324 
325 static tree
326 fold_gimple_assign (gimple_stmt_iterator *si)
327 {
328   gimple stmt = gsi_stmt (*si);
329   enum tree_code subcode = gimple_assign_rhs_code (stmt);
330   location_t loc = gimple_location (stmt);
331 
332   tree result = NULL_TREE;
333 
334   switch (get_gimple_rhs_class (subcode))
335     {
336     case GIMPLE_SINGLE_RHS:
337       {
338         tree rhs = gimple_assign_rhs1 (stmt);
339 
340 	if (TREE_CLOBBER_P (rhs))
341 	  return NULL_TREE;
342 
343 	if (REFERENCE_CLASS_P (rhs))
344 	  return maybe_fold_reference (rhs, false);
345 
346 	else if (TREE_CODE (rhs) == OBJ_TYPE_REF)
347 	  {
348 	    tree val = OBJ_TYPE_REF_EXPR (rhs);
349 	    if (is_gimple_min_invariant (val))
350 	      return val;
351 	    else if (flag_devirtualize && virtual_method_call_p (rhs))
352 	      {
353 		bool final;
354 		vec <cgraph_node *>targets
355 		  = possible_polymorphic_call_targets (rhs, stmt, &final);
356 		if (final && targets.length () <= 1 && dbg_cnt (devirt))
357 		  {
358 		    if (dump_enabled_p ())
359 		      {
360 			location_t loc = gimple_location_safe (stmt);
361 			dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
362 					 "resolving virtual function address "
363 					 "reference to function %s\n",
364 					 targets.length () == 1
365 					 ? targets[0]->name ()
366 					 : "NULL");
367 		      }
368 		    if (targets.length () == 1)
369 		      {
370 			val = fold_convert (TREE_TYPE (val),
371 					    build_fold_addr_expr_loc
372 					      (loc, targets[0]->decl));
373 			STRIP_USELESS_TYPE_CONVERSION (val);
374 		      }
375 		    else
376 		      /* We can not use __builtin_unreachable here because it
377 			 can not have address taken.  */
378 		      val = build_int_cst (TREE_TYPE (val), 0);
379 		    return val;
380 		  }
381 	      }
382 
383 	  }
384 	else if (TREE_CODE (rhs) == ADDR_EXPR)
385 	  {
386 	    tree ref = TREE_OPERAND (rhs, 0);
387 	    tree tem = maybe_fold_reference (ref, true);
388 	    if (tem
389 		&& TREE_CODE (tem) == MEM_REF
390 		&& integer_zerop (TREE_OPERAND (tem, 1)))
391 	      result = fold_convert (TREE_TYPE (rhs), TREE_OPERAND (tem, 0));
392 	    else if (tem)
393 	      result = fold_convert (TREE_TYPE (rhs),
394 				     build_fold_addr_expr_loc (loc, tem));
395 	    else if (TREE_CODE (ref) == MEM_REF
396 		     && integer_zerop (TREE_OPERAND (ref, 1)))
397 	      result = fold_convert (TREE_TYPE (rhs), TREE_OPERAND (ref, 0));
398 	  }
399 
400 	else if (TREE_CODE (rhs) == CONSTRUCTOR
401 		 && TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE
402 		 && (CONSTRUCTOR_NELTS (rhs)
403 		     == TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs))))
404 	  {
405 	    /* Fold a constant vector CONSTRUCTOR to VECTOR_CST.  */
406 	    unsigned i;
407 	    tree val;
408 
409 	    FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val)
410 	      if (TREE_CODE (val) != INTEGER_CST
411 		  && TREE_CODE (val) != REAL_CST
412 		  && TREE_CODE (val) != FIXED_CST)
413 		return NULL_TREE;
414 
415 	    return build_vector_from_ctor (TREE_TYPE (rhs),
416 					   CONSTRUCTOR_ELTS (rhs));
417 	  }
418 
419 	else if (DECL_P (rhs))
420 	  return get_symbol_constant_value (rhs);
421 
422         /* If we couldn't fold the RHS, hand over to the generic
423            fold routines.  */
424         if (result == NULL_TREE)
425           result = fold (rhs);
426 
427         /* Strip away useless type conversions.  Both the NON_LVALUE_EXPR
428            that may have been added by fold, and "useless" type
429            conversions that might now be apparent due to propagation.  */
430         STRIP_USELESS_TYPE_CONVERSION (result);
431 
432         if (result != rhs && valid_gimple_rhs_p (result))
433 	  return result;
434 
435 	return NULL_TREE;
436       }
437       break;
438 
439     case GIMPLE_UNARY_RHS:
440       break;
441 
442     case GIMPLE_BINARY_RHS:
443       /* Try to canonicalize for boolean-typed X the comparisons
444 	 X == 0, X == 1, X != 0, and X != 1.  */
445       if (gimple_assign_rhs_code (stmt) == EQ_EXPR
446 	  || gimple_assign_rhs_code (stmt) == NE_EXPR)
447         {
448 	  tree lhs = gimple_assign_lhs (stmt);
449 	  tree op1 = gimple_assign_rhs1 (stmt);
450 	  tree op2 = gimple_assign_rhs2 (stmt);
451 	  tree type = TREE_TYPE (op1);
452 
453 	  /* Check whether the comparison operands are of the same boolean
454 	     type as the result type is.
455 	     Check that second operand is an integer-constant with value
456 	     one or zero.  */
457 	  if (TREE_CODE (op2) == INTEGER_CST
458 	      && (integer_zerop (op2) || integer_onep (op2))
459 	      && useless_type_conversion_p (TREE_TYPE (lhs), type))
460 	    {
461 	      enum tree_code cmp_code = gimple_assign_rhs_code (stmt);
462 	      bool is_logical_not = false;
463 
464 	      /* X == 0 and X != 1 is a logical-not.of X
465 	         X == 1 and X != 0 is X  */
466 	      if ((cmp_code == EQ_EXPR && integer_zerop (op2))
467 	          || (cmp_code == NE_EXPR && integer_onep (op2)))
468 	        is_logical_not = true;
469 
470 	      if (is_logical_not == false)
471 	        result = op1;
472 	      /* Only for one-bit precision typed X the transformation
473 	         !X -> ~X is valied.  */
474 	      else if (TYPE_PRECISION (type) == 1)
475 		result = build1_loc (gimple_location (stmt), BIT_NOT_EXPR,
476 				     type, op1);
477 	      /* Otherwise we use !X -> X ^ 1.  */
478 	      else
479 	        result = build2_loc (gimple_location (stmt), BIT_XOR_EXPR,
480 				     type, op1, build_int_cst (type, 1));
481 
482 	    }
483 	}
484 
485       if (!result)
486         result = fold_binary_loc (loc, subcode,
487 				  TREE_TYPE (gimple_assign_lhs (stmt)),
488 				  gimple_assign_rhs1 (stmt),
489 				  gimple_assign_rhs2 (stmt));
490 
491       if (result)
492         {
493           STRIP_USELESS_TYPE_CONVERSION (result);
494           if (valid_gimple_rhs_p (result))
495 	    return result;
496         }
497       break;
498 
499     case GIMPLE_TERNARY_RHS:
500       /* Try to fold a conditional expression.  */
501       if (gimple_assign_rhs_code (stmt) == COND_EXPR)
502 	{
503 	  tree op0 = gimple_assign_rhs1 (stmt);
504 	  tree tem;
505 	  bool set = false;
506 	  location_t cond_loc = gimple_location (stmt);
507 
508 	  if (COMPARISON_CLASS_P (op0))
509 	    {
510 	      fold_defer_overflow_warnings ();
511 	      tem = fold_binary_loc (cond_loc,
512 				     TREE_CODE (op0), TREE_TYPE (op0),
513 				     TREE_OPERAND (op0, 0),
514 				     TREE_OPERAND (op0, 1));
515 	      /* This is actually a conditional expression, not a GIMPLE
516 		 conditional statement, however, the valid_gimple_rhs_p
517 		 test still applies.  */
518 	      set = (tem && is_gimple_condexpr (tem)
519 		     && valid_gimple_rhs_p (tem));
520 	      fold_undefer_overflow_warnings (set, stmt, 0);
521 	    }
522 	  else if (is_gimple_min_invariant (op0))
523 	    {
524 	      tem = op0;
525 	      set = true;
526 	    }
527 	  else
528 	    return NULL_TREE;
529 
530 	  if (set)
531 	    result = fold_build3_loc (cond_loc, COND_EXPR,
532 				      TREE_TYPE (gimple_assign_lhs (stmt)), tem,
533 				      gimple_assign_rhs2 (stmt),
534 				      gimple_assign_rhs3 (stmt));
535 	}
536 
537       if (!result)
538 	result = fold_ternary_loc (loc, subcode,
539 				   TREE_TYPE (gimple_assign_lhs (stmt)),
540 				   gimple_assign_rhs1 (stmt),
541 				   gimple_assign_rhs2 (stmt),
542 				   gimple_assign_rhs3 (stmt));
543 
544       if (result)
545         {
546           STRIP_USELESS_TYPE_CONVERSION (result);
547           if (valid_gimple_rhs_p (result))
548 	    return result;
549         }
550       break;
551 
552     case GIMPLE_INVALID_RHS:
553       gcc_unreachable ();
554     }
555 
556   return NULL_TREE;
557 }
558 
559 /* Attempt to fold a conditional statement. Return true if any changes were
560    made. We only attempt to fold the condition expression, and do not perform
561    any transformation that would require alteration of the cfg.  It is
562    assumed that the operands have been previously folded.  */
563 
564 static bool
565 fold_gimple_cond (gcond *stmt)
566 {
567   tree result = fold_binary_loc (gimple_location (stmt),
568 			     gimple_cond_code (stmt),
569                              boolean_type_node,
570                              gimple_cond_lhs (stmt),
571                              gimple_cond_rhs (stmt));
572 
573   if (result)
574     {
575       STRIP_USELESS_TYPE_CONVERSION (result);
576       if (is_gimple_condexpr (result) && valid_gimple_rhs_p (result))
577         {
578           gimple_cond_set_condition_from_tree (stmt, result);
579           return true;
580         }
581     }
582 
583   return false;
584 }
585 
586 
587 /* Replace a statement at *SI_P with a sequence of statements in STMTS,
588    adjusting the replacement stmts location and virtual operands.
589    If the statement has a lhs the last stmt in the sequence is expected
590    to assign to that lhs.  */
591 
592 static void
593 gsi_replace_with_seq_vops (gimple_stmt_iterator *si_p, gimple_seq stmts)
594 {
595   gimple stmt = gsi_stmt (*si_p);
596 
597   if (gimple_has_location (stmt))
598     annotate_all_with_location (stmts, gimple_location (stmt));
599 
600   /* First iterate over the replacement statements backward, assigning
601      virtual operands to their defining statements.  */
602   gimple laststore = NULL;
603   for (gimple_stmt_iterator i = gsi_last (stmts);
604        !gsi_end_p (i); gsi_prev (&i))
605     {
606       gimple new_stmt = gsi_stmt (i);
607       if ((gimple_assign_single_p (new_stmt)
608 	   && !is_gimple_reg (gimple_assign_lhs (new_stmt)))
609 	  || (is_gimple_call (new_stmt)
610 	      && (gimple_call_flags (new_stmt)
611 		  & (ECF_NOVOPS | ECF_PURE | ECF_CONST | ECF_NORETURN)) == 0))
612 	{
613 	  tree vdef;
614 	  if (!laststore)
615 	    vdef = gimple_vdef (stmt);
616 	  else
617 	    vdef = make_ssa_name (gimple_vop (cfun), new_stmt);
618 	  gimple_set_vdef (new_stmt, vdef);
619 	  if (vdef && TREE_CODE (vdef) == SSA_NAME)
620 	    SSA_NAME_DEF_STMT (vdef) = new_stmt;
621 	  laststore = new_stmt;
622 	}
623     }
624 
625   /* Second iterate over the statements forward, assigning virtual
626      operands to their uses.  */
627   tree reaching_vuse = gimple_vuse (stmt);
628   for (gimple_stmt_iterator i = gsi_start (stmts);
629        !gsi_end_p (i); gsi_next (&i))
630     {
631       gimple new_stmt = gsi_stmt (i);
632       /* If the new statement possibly has a VUSE, update it with exact SSA
633 	 name we know will reach this one.  */
634       if (gimple_has_mem_ops (new_stmt))
635 	gimple_set_vuse (new_stmt, reaching_vuse);
636       gimple_set_modified (new_stmt, true);
637       if (gimple_vdef (new_stmt))
638 	reaching_vuse = gimple_vdef (new_stmt);
639     }
640 
641   /* If the new sequence does not do a store release the virtual
642      definition of the original statement.  */
643   if (reaching_vuse
644       && reaching_vuse == gimple_vuse (stmt))
645     {
646       tree vdef = gimple_vdef (stmt);
647       if (vdef
648 	  && TREE_CODE (vdef) == SSA_NAME)
649 	{
650 	  unlink_stmt_vdef (stmt);
651 	  release_ssa_name (vdef);
652 	}
653     }
654 
655   /* Finally replace the original statement with the sequence.  */
656   gsi_replace_with_seq (si_p, stmts, false);
657 }
658 
659 /* Convert EXPR into a GIMPLE value suitable for substitution on the
660    RHS of an assignment.  Insert the necessary statements before
661    iterator *SI_P.  The statement at *SI_P, which must be a GIMPLE_CALL
662    is replaced.  If the call is expected to produces a result, then it
663    is replaced by an assignment of the new RHS to the result variable.
664    If the result is to be ignored, then the call is replaced by a
665    GIMPLE_NOP.  A proper VDEF chain is retained by making the first
666    VUSE and the last VDEF of the whole sequence be the same as the replaced
667    statement and using new SSA names for stores in between.  */
668 
669 void
670 gimplify_and_update_call_from_tree (gimple_stmt_iterator *si_p, tree expr)
671 {
672   tree lhs;
673   gimple stmt, new_stmt;
674   gimple_stmt_iterator i;
675   gimple_seq stmts = NULL;
676 
677   stmt = gsi_stmt (*si_p);
678 
679   gcc_assert (is_gimple_call (stmt));
680 
681   push_gimplify_context (gimple_in_ssa_p (cfun));
682 
683   lhs = gimple_call_lhs (stmt);
684   if (lhs == NULL_TREE)
685     {
686       gimplify_and_add (expr, &stmts);
687       /* We can end up with folding a memcpy of an empty class assignment
688 	 which gets optimized away by C++ gimplification.  */
689       if (gimple_seq_empty_p (stmts))
690 	{
691 	  pop_gimplify_context (NULL);
692 	  if (gimple_in_ssa_p (cfun))
693 	    {
694 	      unlink_stmt_vdef (stmt);
695 	      release_defs (stmt);
696 	    }
697 	  gsi_replace (si_p, gimple_build_nop (), false);
698 	  return;
699 	}
700     }
701   else
702     {
703       tree tmp = get_initialized_tmp_var (expr, &stmts, NULL);
704       new_stmt = gimple_build_assign (lhs, tmp);
705       i = gsi_last (stmts);
706       gsi_insert_after_without_update (&i, new_stmt,
707 				       GSI_CONTINUE_LINKING);
708     }
709 
710   pop_gimplify_context (NULL);
711 
712   gsi_replace_with_seq_vops (si_p, stmts);
713 }
714 
715 
716 /* Replace the call at *GSI with the gimple value VAL.  */
717 
718 static void
719 replace_call_with_value (gimple_stmt_iterator *gsi, tree val)
720 {
721   gimple stmt = gsi_stmt (*gsi);
722   tree lhs = gimple_call_lhs (stmt);
723   gimple repl;
724   if (lhs)
725     {
726       if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (val)))
727 	val = fold_convert (TREE_TYPE (lhs), val);
728       repl = gimple_build_assign (lhs, val);
729     }
730   else
731     repl = gimple_build_nop ();
732   tree vdef = gimple_vdef (stmt);
733   if (vdef && TREE_CODE (vdef) == SSA_NAME)
734     {
735       unlink_stmt_vdef (stmt);
736       release_ssa_name (vdef);
737     }
738   gsi_replace (gsi, repl, false);
739 }
740 
741 /* Replace the call at *GSI with the new call REPL and fold that
742    again.  */
743 
744 static void
745 replace_call_with_call_and_fold (gimple_stmt_iterator *gsi, gimple repl)
746 {
747   gimple stmt = gsi_stmt (*gsi);
748   gimple_call_set_lhs (repl, gimple_call_lhs (stmt));
749   gimple_set_location (repl, gimple_location (stmt));
750   if (gimple_vdef (stmt)
751       && TREE_CODE (gimple_vdef (stmt)) == SSA_NAME)
752     {
753       gimple_set_vdef (repl, gimple_vdef (stmt));
754       gimple_set_vuse (repl, gimple_vuse (stmt));
755       SSA_NAME_DEF_STMT (gimple_vdef (repl)) = repl;
756     }
757   gsi_replace (gsi, repl, false);
758   fold_stmt (gsi);
759 }
760 
761 /* Return true if VAR is a VAR_DECL or a component thereof.  */
762 
763 static bool
764 var_decl_component_p (tree var)
765 {
766   tree inner = var;
767   while (handled_component_p (inner))
768     inner = TREE_OPERAND (inner, 0);
769   return SSA_VAR_P (inner);
770 }
771 
772 /* Fold function call to builtin mem{{,p}cpy,move}.  Return
773    false if no simplification can be made.
774    If ENDP is 0, return DEST (like memcpy).
775    If ENDP is 1, return DEST+LEN (like mempcpy).
776    If ENDP is 2, return DEST+LEN-1 (like stpcpy).
777    If ENDP is 3, return DEST, additionally *SRC and *DEST may overlap
778    (memmove).   */
779 
780 static bool
781 gimple_fold_builtin_memory_op (gimple_stmt_iterator *gsi,
782 			       tree dest, tree src, int endp)
783 {
784   gimple stmt = gsi_stmt (*gsi);
785   tree lhs = gimple_call_lhs (stmt);
786   tree len = gimple_call_arg (stmt, 2);
787   tree destvar, srcvar;
788   location_t loc = gimple_location (stmt);
789 
790   /* If the LEN parameter is zero, return DEST.  */
791   if (integer_zerop (len))
792     {
793       gimple repl;
794       if (gimple_call_lhs (stmt))
795 	repl = gimple_build_assign (gimple_call_lhs (stmt), dest);
796       else
797 	repl = gimple_build_nop ();
798       tree vdef = gimple_vdef (stmt);
799       if (vdef && TREE_CODE (vdef) == SSA_NAME)
800 	{
801 	  unlink_stmt_vdef (stmt);
802 	  release_ssa_name (vdef);
803 	}
804       gsi_replace (gsi, repl, false);
805       return true;
806     }
807 
808   /* If SRC and DEST are the same (and not volatile), return
809      DEST{,+LEN,+LEN-1}.  */
810   if (operand_equal_p (src, dest, 0))
811     {
812       unlink_stmt_vdef (stmt);
813       if (gimple_vdef (stmt) && TREE_CODE (gimple_vdef (stmt)) == SSA_NAME)
814 	release_ssa_name (gimple_vdef (stmt));
815       if (!lhs)
816 	{
817 	  gsi_replace (gsi, gimple_build_nop (), false);
818 	  return true;
819 	}
820       goto done;
821     }
822   else
823     {
824       tree srctype, desttype;
825       unsigned int src_align, dest_align;
826       tree off0;
827 
828       /* Inlining of memcpy/memmove may cause bounds lost (if we copy
829 	 pointers as wide integer) and also may result in huge function
830 	 size because of inlined bounds copy.  Thus don't inline for
831 	 functions we want to instrument.  */
832       if (flag_check_pointer_bounds
833 	  && chkp_instrumentable_p (cfun->decl)
834 	  /* Even if data may contain pointers we can inline if copy
835 	     less than a pointer size.  */
836 	  && (!tree_fits_uhwi_p (len)
837 	      || compare_tree_int (len, POINTER_SIZE_UNITS) >= 0))
838 	return false;
839 
840       /* Build accesses at offset zero with a ref-all character type.  */
841       off0 = build_int_cst (build_pointer_type_for_mode (char_type_node,
842 							 ptr_mode, true), 0);
843 
844       /* If we can perform the copy efficiently with first doing all loads
845          and then all stores inline it that way.  Currently efficiently
846 	 means that we can load all the memory into a single integer
847 	 register which is what MOVE_MAX gives us.  */
848       src_align = get_pointer_alignment (src);
849       dest_align = get_pointer_alignment (dest);
850       if (tree_fits_uhwi_p (len)
851 	  && compare_tree_int (len, MOVE_MAX) <= 0
852 	  /* ???  Don't transform copies from strings with known length this
853 	     confuses the tree-ssa-strlen.c.  This doesn't handle
854 	     the case in gcc.dg/strlenopt-8.c which is XFAILed for that
855 	     reason.  */
856 	  && !c_strlen (src, 2))
857 	{
858 	  unsigned ilen = tree_to_uhwi (len);
859 	  if (exact_log2 (ilen) != -1)
860 	    {
861 	      tree type = lang_hooks.types.type_for_size (ilen * 8, 1);
862 	      if (type
863 		  && TYPE_MODE (type) != BLKmode
864 		  && (GET_MODE_SIZE (TYPE_MODE (type)) * BITS_PER_UNIT
865 		      == ilen * 8)
866 		  /* If the destination pointer is not aligned we must be able
867 		     to emit an unaligned store.  */
868 		  && (dest_align >= GET_MODE_ALIGNMENT (TYPE_MODE (type))
869 		      || !SLOW_UNALIGNED_ACCESS (TYPE_MODE (type), dest_align)))
870 		{
871 		  tree srctype = type;
872 		  tree desttype = type;
873 		  if (src_align < GET_MODE_ALIGNMENT (TYPE_MODE (type)))
874 		    srctype = build_aligned_type (type, src_align);
875 		  tree srcmem = fold_build2 (MEM_REF, srctype, src, off0);
876 		  tree tem = fold_const_aggregate_ref (srcmem);
877 		  if (tem)
878 		    srcmem = tem;
879 		  else if (src_align < GET_MODE_ALIGNMENT (TYPE_MODE (type))
880 			   && SLOW_UNALIGNED_ACCESS (TYPE_MODE (type),
881 						     src_align))
882 		    srcmem = NULL_TREE;
883 		  if (srcmem)
884 		    {
885 		      gimple new_stmt;
886 		      if (is_gimple_reg_type (TREE_TYPE (srcmem)))
887 			{
888 			  new_stmt = gimple_build_assign (NULL_TREE, srcmem);
889 			  if (gimple_in_ssa_p (cfun))
890 			    srcmem = make_ssa_name (TREE_TYPE (srcmem),
891 						    new_stmt);
892 			  else
893 			    srcmem = create_tmp_reg (TREE_TYPE (srcmem));
894 			  gimple_assign_set_lhs (new_stmt, srcmem);
895 			  gimple_set_vuse (new_stmt, gimple_vuse (stmt));
896 			  gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
897 			}
898 		      if (dest_align < GET_MODE_ALIGNMENT (TYPE_MODE (type)))
899 			desttype = build_aligned_type (type, dest_align);
900 		      new_stmt
901 			= gimple_build_assign (fold_build2 (MEM_REF, desttype,
902 							    dest, off0),
903 					       srcmem);
904 		      gimple_set_vuse (new_stmt, gimple_vuse (stmt));
905 		      gimple_set_vdef (new_stmt, gimple_vdef (stmt));
906 		      if (gimple_vdef (new_stmt)
907 			  && TREE_CODE (gimple_vdef (new_stmt)) == SSA_NAME)
908 			SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
909 		      if (!lhs)
910 			{
911 			  gsi_replace (gsi, new_stmt, false);
912 			  return true;
913 			}
914 		      gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
915 		      goto done;
916 		    }
917 		}
918 	    }
919 	}
920 
921       if (endp == 3)
922 	{
923 	  /* Both DEST and SRC must be pointer types.
924 	     ??? This is what old code did.  Is the testing for pointer types
925 	     really mandatory?
926 
927 	     If either SRC is readonly or length is 1, we can use memcpy.  */
928 	  if (!dest_align || !src_align)
929 	    return false;
930 	  if (readonly_data_expr (src)
931 	      || (tree_fits_uhwi_p (len)
932 		  && (MIN (src_align, dest_align) / BITS_PER_UNIT
933 		      >= tree_to_uhwi (len))))
934 	    {
935 	      tree fn = builtin_decl_implicit (BUILT_IN_MEMCPY);
936 	      if (!fn)
937 		return false;
938 	      gimple_call_set_fndecl (stmt, fn);
939 	      gimple_call_set_arg (stmt, 0, dest);
940 	      gimple_call_set_arg (stmt, 1, src);
941 	      fold_stmt (gsi);
942 	      return true;
943 	    }
944 
945 	  /* If *src and *dest can't overlap, optimize into memcpy as well.  */
946 	  if (TREE_CODE (src) == ADDR_EXPR
947 	      && TREE_CODE (dest) == ADDR_EXPR)
948 	    {
949 	      tree src_base, dest_base, fn;
950 	      HOST_WIDE_INT src_offset = 0, dest_offset = 0;
951 	      HOST_WIDE_INT maxsize;
952 
953 	      srcvar = TREE_OPERAND (src, 0);
954 	      src_base = get_addr_base_and_unit_offset (srcvar, &src_offset);
955 	      if (src_base == NULL)
956 		src_base = srcvar;
957 	      destvar = TREE_OPERAND (dest, 0);
958 	      dest_base = get_addr_base_and_unit_offset (destvar,
959 							 &dest_offset);
960 	      if (dest_base == NULL)
961 		dest_base = destvar;
962 	      if (tree_fits_uhwi_p (len))
963 		maxsize = tree_to_uhwi (len);
964 	      else
965 		maxsize = -1;
966 	      if (SSA_VAR_P (src_base)
967 		  && SSA_VAR_P (dest_base))
968 		{
969 		  if (operand_equal_p (src_base, dest_base, 0)
970 		      && ranges_overlap_p (src_offset, maxsize,
971 					   dest_offset, maxsize))
972 		    return false;
973 		}
974 	      else if (TREE_CODE (src_base) == MEM_REF
975 		       && TREE_CODE (dest_base) == MEM_REF)
976 		{
977 		  if (! operand_equal_p (TREE_OPERAND (src_base, 0),
978 					 TREE_OPERAND (dest_base, 0), 0))
979 		    return false;
980 		  offset_int off = mem_ref_offset (src_base) + src_offset;
981 		  if (!wi::fits_shwi_p (off))
982 		    return false;
983 		  src_offset = off.to_shwi ();
984 
985 		  off = mem_ref_offset (dest_base) + dest_offset;
986 		  if (!wi::fits_shwi_p (off))
987 		    return false;
988 		  dest_offset = off.to_shwi ();
989 		  if (ranges_overlap_p (src_offset, maxsize,
990 					dest_offset, maxsize))
991 		    return false;
992 		}
993 	      else
994 		return false;
995 
996 	      fn = builtin_decl_implicit (BUILT_IN_MEMCPY);
997 	      if (!fn)
998 		return false;
999 	      gimple_call_set_fndecl (stmt, fn);
1000 	      gimple_call_set_arg (stmt, 0, dest);
1001 	      gimple_call_set_arg (stmt, 1, src);
1002 	      fold_stmt (gsi);
1003 	      return true;
1004 	    }
1005 
1006 	  /* If the destination and source do not alias optimize into
1007 	     memcpy as well.  */
1008 	  if ((is_gimple_min_invariant (dest)
1009 	       || TREE_CODE (dest) == SSA_NAME)
1010 	      && (is_gimple_min_invariant (src)
1011 		  || TREE_CODE (src) == SSA_NAME))
1012 	    {
1013 	      ao_ref destr, srcr;
1014 	      ao_ref_init_from_ptr_and_size (&destr, dest, len);
1015 	      ao_ref_init_from_ptr_and_size (&srcr, src, len);
1016 	      if (!refs_may_alias_p_1 (&destr, &srcr, false))
1017 		{
1018 		  tree fn;
1019 		  fn = builtin_decl_implicit (BUILT_IN_MEMCPY);
1020 		  if (!fn)
1021 		    return false;
1022 		  gimple_call_set_fndecl (stmt, fn);
1023 		  gimple_call_set_arg (stmt, 0, dest);
1024 		  gimple_call_set_arg (stmt, 1, src);
1025 		  fold_stmt (gsi);
1026 		  return true;
1027 		}
1028 	    }
1029 
1030 	  return false;
1031 	}
1032 
1033       if (!tree_fits_shwi_p (len))
1034 	return false;
1035       /* FIXME:
1036          This logic lose for arguments like (type *)malloc (sizeof (type)),
1037          since we strip the casts of up to VOID return value from malloc.
1038 	 Perhaps we ought to inherit type from non-VOID argument here?  */
1039       STRIP_NOPS (src);
1040       STRIP_NOPS (dest);
1041       if (!POINTER_TYPE_P (TREE_TYPE (src))
1042 	  || !POINTER_TYPE_P (TREE_TYPE (dest)))
1043 	return false;
1044       /* In the following try to find a type that is most natural to be
1045 	 used for the memcpy source and destination and that allows
1046 	 the most optimization when memcpy is turned into a plain assignment
1047 	 using that type.  In theory we could always use a char[len] type
1048 	 but that only gains us that the destination and source possibly
1049 	 no longer will have their address taken.  */
1050       /* As we fold (void *)(p + CST) to (void *)p + CST undo this here.  */
1051       if (TREE_CODE (src) == POINTER_PLUS_EXPR)
1052 	{
1053 	  tree tem = TREE_OPERAND (src, 0);
1054 	  STRIP_NOPS (tem);
1055 	  if (tem != TREE_OPERAND (src, 0))
1056 	    src = build1 (NOP_EXPR, TREE_TYPE (tem), src);
1057 	}
1058       if (TREE_CODE (dest) == POINTER_PLUS_EXPR)
1059 	{
1060 	  tree tem = TREE_OPERAND (dest, 0);
1061 	  STRIP_NOPS (tem);
1062 	  if (tem != TREE_OPERAND (dest, 0))
1063 	    dest = build1 (NOP_EXPR, TREE_TYPE (tem), dest);
1064 	}
1065       srctype = TREE_TYPE (TREE_TYPE (src));
1066       if (TREE_CODE (srctype) == ARRAY_TYPE
1067 	  && !tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len))
1068 	{
1069 	  srctype = TREE_TYPE (srctype);
1070 	  STRIP_NOPS (src);
1071 	  src = build1 (NOP_EXPR, build_pointer_type (srctype), src);
1072 	}
1073       desttype = TREE_TYPE (TREE_TYPE (dest));
1074       if (TREE_CODE (desttype) == ARRAY_TYPE
1075 	  && !tree_int_cst_equal (TYPE_SIZE_UNIT (desttype), len))
1076 	{
1077 	  desttype = TREE_TYPE (desttype);
1078 	  STRIP_NOPS (dest);
1079 	  dest = build1 (NOP_EXPR, build_pointer_type (desttype), dest);
1080 	}
1081       if (TREE_ADDRESSABLE (srctype)
1082 	  || TREE_ADDRESSABLE (desttype))
1083 	return false;
1084 
1085       /* Make sure we are not copying using a floating-point mode or
1086          a type whose size possibly does not match its precision.  */
1087       if (FLOAT_MODE_P (TYPE_MODE (desttype))
1088 	  || TREE_CODE (desttype) == BOOLEAN_TYPE
1089 	  || TREE_CODE (desttype) == ENUMERAL_TYPE)
1090 	desttype = bitwise_type_for_mode (TYPE_MODE (desttype));
1091       if (FLOAT_MODE_P (TYPE_MODE (srctype))
1092 	  || TREE_CODE (srctype) == BOOLEAN_TYPE
1093 	  || TREE_CODE (srctype) == ENUMERAL_TYPE)
1094 	srctype = bitwise_type_for_mode (TYPE_MODE (srctype));
1095       if (!srctype)
1096 	srctype = desttype;
1097       if (!desttype)
1098 	desttype = srctype;
1099       if (!srctype)
1100 	return false;
1101 
1102       src_align = get_pointer_alignment (src);
1103       dest_align = get_pointer_alignment (dest);
1104       if (dest_align < TYPE_ALIGN (desttype)
1105 	  || src_align < TYPE_ALIGN (srctype))
1106 	return false;
1107 
1108       destvar = dest;
1109       STRIP_NOPS (destvar);
1110       if (TREE_CODE (destvar) == ADDR_EXPR
1111 	  && var_decl_component_p (TREE_OPERAND (destvar, 0))
1112 	  && tree_int_cst_equal (TYPE_SIZE_UNIT (desttype), len))
1113 	destvar = fold_build2 (MEM_REF, desttype, destvar, off0);
1114       else
1115 	destvar = NULL_TREE;
1116 
1117       srcvar = src;
1118       STRIP_NOPS (srcvar);
1119       if (TREE_CODE (srcvar) == ADDR_EXPR
1120 	  && var_decl_component_p (TREE_OPERAND (srcvar, 0))
1121 	  && tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len))
1122 	{
1123 	  if (!destvar
1124 	      || src_align >= TYPE_ALIGN (desttype))
1125 	    srcvar = fold_build2 (MEM_REF, destvar ? desttype : srctype,
1126 				  srcvar, off0);
1127 	  else if (!STRICT_ALIGNMENT)
1128 	    {
1129 	      srctype = build_aligned_type (TYPE_MAIN_VARIANT (desttype),
1130 					    src_align);
1131 	      srcvar = fold_build2 (MEM_REF, srctype, srcvar, off0);
1132 	    }
1133 	  else
1134 	    srcvar = NULL_TREE;
1135 	}
1136       else
1137 	srcvar = NULL_TREE;
1138 
1139       if (srcvar == NULL_TREE && destvar == NULL_TREE)
1140 	return false;
1141 
1142       if (srcvar == NULL_TREE)
1143 	{
1144 	  STRIP_NOPS (src);
1145 	  if (src_align >= TYPE_ALIGN (desttype))
1146 	    srcvar = fold_build2 (MEM_REF, desttype, src, off0);
1147 	  else
1148 	    {
1149 	      if (STRICT_ALIGNMENT)
1150 		return false;
1151 	      srctype = build_aligned_type (TYPE_MAIN_VARIANT (desttype),
1152 					    src_align);
1153 	      srcvar = fold_build2 (MEM_REF, srctype, src, off0);
1154 	    }
1155 	}
1156       else if (destvar == NULL_TREE)
1157 	{
1158 	  STRIP_NOPS (dest);
1159 	  if (dest_align >= TYPE_ALIGN (srctype))
1160 	    destvar = fold_build2 (MEM_REF, srctype, dest, off0);
1161 	  else
1162 	    {
1163 	      if (STRICT_ALIGNMENT)
1164 		return false;
1165 	      desttype = build_aligned_type (TYPE_MAIN_VARIANT (srctype),
1166 					     dest_align);
1167 	      destvar = fold_build2 (MEM_REF, desttype, dest, off0);
1168 	    }
1169 	}
1170 
1171       gimple new_stmt;
1172       if (is_gimple_reg_type (TREE_TYPE (srcvar)))
1173 	{
1174 	  new_stmt = gimple_build_assign (NULL_TREE, srcvar);
1175 	  if (gimple_in_ssa_p (cfun))
1176 	    srcvar = make_ssa_name (TREE_TYPE (srcvar), new_stmt);
1177 	  else
1178 	    srcvar = create_tmp_reg (TREE_TYPE (srcvar));
1179 	  gimple_assign_set_lhs (new_stmt, srcvar);
1180 	  gimple_set_vuse (new_stmt, gimple_vuse (stmt));
1181 	  gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
1182 	}
1183       new_stmt = gimple_build_assign (destvar, srcvar);
1184       gimple_set_vuse (new_stmt, gimple_vuse (stmt));
1185       gimple_set_vdef (new_stmt, gimple_vdef (stmt));
1186       if (gimple_vdef (new_stmt)
1187 	  && TREE_CODE (gimple_vdef (new_stmt)) == SSA_NAME)
1188 	SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
1189       if (!lhs)
1190 	{
1191 	  gsi_replace (gsi, new_stmt, false);
1192 	  return true;
1193 	}
1194       gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
1195     }
1196 
1197 done:
1198   if (endp == 0 || endp == 3)
1199     len = NULL_TREE;
1200   else if (endp == 2)
1201     len = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (len), len,
1202 			   ssize_int (1));
1203   if (endp == 2 || endp == 1)
1204     dest = fold_build_pointer_plus_loc (loc, dest, len);
1205 
1206   dest = force_gimple_operand_gsi (gsi, dest, false, NULL_TREE, true,
1207 				   GSI_SAME_STMT);
1208   gimple repl = gimple_build_assign (lhs, dest);
1209   gsi_replace (gsi, repl, false);
1210   return true;
1211 }
1212 
1213 /* Fold function call to builtin memset or bzero at *GSI setting the
1214    memory of size LEN to VAL.  Return whether a simplification was made.  */
1215 
1216 static bool
1217 gimple_fold_builtin_memset (gimple_stmt_iterator *gsi, tree c, tree len)
1218 {
1219   gimple stmt = gsi_stmt (*gsi);
1220   tree etype;
1221   unsigned HOST_WIDE_INT length, cval;
1222 
1223   /* If the LEN parameter is zero, return DEST.  */
1224   if (integer_zerop (len))
1225     {
1226       replace_call_with_value (gsi, gimple_call_arg (stmt, 0));
1227       return true;
1228     }
1229 
1230   if (! tree_fits_uhwi_p (len))
1231     return false;
1232 
1233   if (TREE_CODE (c) != INTEGER_CST)
1234     return false;
1235 
1236   tree dest = gimple_call_arg (stmt, 0);
1237   tree var = dest;
1238   if (TREE_CODE (var) != ADDR_EXPR)
1239     return false;
1240 
1241   var = TREE_OPERAND (var, 0);
1242   if (TREE_THIS_VOLATILE (var))
1243     return false;
1244 
1245   etype = TREE_TYPE (var);
1246   if (TREE_CODE (etype) == ARRAY_TYPE)
1247     etype = TREE_TYPE (etype);
1248 
1249   if (!INTEGRAL_TYPE_P (etype)
1250       && !POINTER_TYPE_P (etype))
1251     return NULL_TREE;
1252 
1253   if (! var_decl_component_p (var))
1254     return NULL_TREE;
1255 
1256   length = tree_to_uhwi (len);
1257   if (GET_MODE_SIZE (TYPE_MODE (etype)) != length
1258       || get_pointer_alignment (dest) / BITS_PER_UNIT < length)
1259     return NULL_TREE;
1260 
1261   if (length > HOST_BITS_PER_WIDE_INT / BITS_PER_UNIT)
1262     return NULL_TREE;
1263 
1264   if (integer_zerop (c))
1265     cval = 0;
1266   else
1267     {
1268       if (CHAR_BIT != 8 || BITS_PER_UNIT != 8 || HOST_BITS_PER_WIDE_INT > 64)
1269 	return NULL_TREE;
1270 
1271       cval = TREE_INT_CST_LOW (c);
1272       cval &= 0xff;
1273       cval |= cval << 8;
1274       cval |= cval << 16;
1275       cval |= (cval << 31) << 1;
1276     }
1277 
1278   var = fold_build2 (MEM_REF, etype, dest, build_int_cst (ptr_type_node, 0));
1279   gimple store = gimple_build_assign (var, build_int_cst_type (etype, cval));
1280   gimple_set_vuse (store, gimple_vuse (stmt));
1281   tree vdef = gimple_vdef (stmt);
1282   if (vdef && TREE_CODE (vdef) == SSA_NAME)
1283     {
1284       gimple_set_vdef (store, gimple_vdef (stmt));
1285       SSA_NAME_DEF_STMT (gimple_vdef (stmt)) = store;
1286     }
1287   gsi_insert_before (gsi, store, GSI_SAME_STMT);
1288   if (gimple_call_lhs (stmt))
1289     {
1290       gimple asgn = gimple_build_assign (gimple_call_lhs (stmt), dest);
1291       gsi_replace (gsi, asgn, false);
1292     }
1293   else
1294     {
1295       gimple_stmt_iterator gsi2 = *gsi;
1296       gsi_prev (gsi);
1297       gsi_remove (&gsi2, true);
1298     }
1299 
1300   return true;
1301 }
1302 
1303 
1304 /* Return the string length, maximum string length or maximum value of
1305    ARG in LENGTH.
1306    If ARG is an SSA name variable, follow its use-def chains.  If LENGTH
1307    is not NULL and, for TYPE == 0, its value is not equal to the length
1308    we determine or if we are unable to determine the length or value,
1309    return false.  VISITED is a bitmap of visited variables.
1310    TYPE is 0 if string length should be returned, 1 for maximum string
1311    length and 2 for maximum value ARG can have.  */
1312 
1313 static bool
1314 get_maxval_strlen (tree arg, tree *length, bitmap *visited, int type)
1315 {
1316   tree var, val;
1317   gimple def_stmt;
1318 
1319   if (TREE_CODE (arg) != SSA_NAME)
1320     {
1321       /* We can end up with &(*iftmp_1)[0] here as well, so handle it.  */
1322       if (TREE_CODE (arg) == ADDR_EXPR
1323 	  && TREE_CODE (TREE_OPERAND (arg, 0)) == ARRAY_REF
1324 	  && integer_zerop (TREE_OPERAND (TREE_OPERAND (arg, 0), 1)))
1325 	{
1326 	  tree aop0 = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
1327 	  if (TREE_CODE (aop0) == INDIRECT_REF
1328 	      && TREE_CODE (TREE_OPERAND (aop0, 0)) == SSA_NAME)
1329 	    return get_maxval_strlen (TREE_OPERAND (aop0, 0),
1330 				      length, visited, type);
1331 	}
1332 
1333       if (type == 2)
1334 	{
1335 	  val = arg;
1336 	  if (TREE_CODE (val) != INTEGER_CST
1337 	      || tree_int_cst_sgn (val) < 0)
1338 	    return false;
1339 	}
1340       else
1341 	val = c_strlen (arg, 1);
1342       if (!val)
1343 	return false;
1344 
1345       if (*length)
1346 	{
1347 	  if (type > 0)
1348 	    {
1349 	      if (TREE_CODE (*length) != INTEGER_CST
1350 		  || TREE_CODE (val) != INTEGER_CST)
1351 		return false;
1352 
1353 	      if (tree_int_cst_lt (*length, val))
1354 		*length = val;
1355 	      return true;
1356 	    }
1357 	  else if (simple_cst_equal (val, *length) != 1)
1358 	    return false;
1359 	}
1360 
1361       *length = val;
1362       return true;
1363     }
1364 
1365   /* If ARG is registered for SSA update we cannot look at its defining
1366      statement.  */
1367   if (name_registered_for_update_p (arg))
1368     return false;
1369 
1370   /* If we were already here, break the infinite cycle.  */
1371   if (!*visited)
1372     *visited = BITMAP_ALLOC (NULL);
1373   if (!bitmap_set_bit (*visited, SSA_NAME_VERSION (arg)))
1374     return true;
1375 
1376   var = arg;
1377   def_stmt = SSA_NAME_DEF_STMT (var);
1378 
1379   switch (gimple_code (def_stmt))
1380     {
1381       case GIMPLE_ASSIGN:
1382         /* The RHS of the statement defining VAR must either have a
1383            constant length or come from another SSA_NAME with a constant
1384            length.  */
1385         if (gimple_assign_single_p (def_stmt)
1386             || gimple_assign_unary_nop_p (def_stmt))
1387           {
1388             tree rhs = gimple_assign_rhs1 (def_stmt);
1389             return get_maxval_strlen (rhs, length, visited, type);
1390           }
1391 	else if (gimple_assign_rhs_code (def_stmt) == COND_EXPR)
1392 	  {
1393 	    tree op2 = gimple_assign_rhs2 (def_stmt);
1394 	    tree op3 = gimple_assign_rhs3 (def_stmt);
1395 	    return get_maxval_strlen (op2, length, visited, type)
1396 		   && get_maxval_strlen (op3, length, visited, type);
1397           }
1398         return false;
1399 
1400       case GIMPLE_PHI:
1401 	{
1402 	  /* All the arguments of the PHI node must have the same constant
1403 	     length.  */
1404 	  unsigned i;
1405 
1406 	  for (i = 0; i < gimple_phi_num_args (def_stmt); i++)
1407           {
1408             tree arg = gimple_phi_arg (def_stmt, i)->def;
1409 
1410             /* If this PHI has itself as an argument, we cannot
1411                determine the string length of this argument.  However,
1412                if we can find a constant string length for the other
1413                PHI args then we can still be sure that this is a
1414                constant string length.  So be optimistic and just
1415                continue with the next argument.  */
1416             if (arg == gimple_phi_result (def_stmt))
1417               continue;
1418 
1419             if (!get_maxval_strlen (arg, length, visited, type))
1420               return false;
1421           }
1422         }
1423         return true;
1424 
1425       default:
1426         return false;
1427     }
1428 }
1429 
1430 tree
1431 get_maxval_strlen (tree arg, int type)
1432 {
1433   bitmap visited = NULL;
1434   tree len = NULL_TREE;
1435   if (!get_maxval_strlen (arg, &len, &visited, type))
1436     len = NULL_TREE;
1437   if (visited)
1438     BITMAP_FREE (visited);
1439 
1440   return len;
1441 }
1442 
1443 
1444 /* Fold function call to builtin strcpy with arguments DEST and SRC.
1445    If LEN is not NULL, it represents the length of the string to be
1446    copied.  Return NULL_TREE if no simplification can be made.  */
1447 
1448 static bool
1449 gimple_fold_builtin_strcpy (gimple_stmt_iterator *gsi,
1450 			    tree dest, tree src)
1451 {
1452   location_t loc = gimple_location (gsi_stmt (*gsi));
1453   tree fn;
1454 
1455   /* If SRC and DEST are the same (and not volatile), return DEST.  */
1456   if (operand_equal_p (src, dest, 0))
1457     {
1458       replace_call_with_value (gsi, dest);
1459       return true;
1460     }
1461 
1462   if (optimize_function_for_size_p (cfun))
1463     return false;
1464 
1465   fn = builtin_decl_implicit (BUILT_IN_MEMCPY);
1466   if (!fn)
1467     return false;
1468 
1469   tree len = get_maxval_strlen (src, 0);
1470   if (!len)
1471     return false;
1472 
1473   len = fold_convert_loc (loc, size_type_node, len);
1474   len = size_binop_loc (loc, PLUS_EXPR, len, build_int_cst (size_type_node, 1));
1475   len = force_gimple_operand_gsi (gsi, len, true,
1476 				  NULL_TREE, true, GSI_SAME_STMT);
1477   gimple repl = gimple_build_call (fn, 3, dest, src, len);
1478   replace_call_with_call_and_fold (gsi, repl);
1479   return true;
1480 }
1481 
1482 /* Fold function call to builtin strncpy with arguments DEST, SRC, and LEN.
1483    If SLEN is not NULL, it represents the length of the source string.
1484    Return NULL_TREE if no simplification can be made.  */
1485 
1486 static bool
1487 gimple_fold_builtin_strncpy (gimple_stmt_iterator *gsi,
1488 			     tree dest, tree src, tree len)
1489 {
1490   location_t loc = gimple_location (gsi_stmt (*gsi));
1491   tree fn;
1492 
1493   /* If the LEN parameter is zero, return DEST.  */
1494   if (integer_zerop (len))
1495     {
1496       replace_call_with_value (gsi, dest);
1497       return true;
1498     }
1499 
1500   /* We can't compare slen with len as constants below if len is not a
1501      constant.  */
1502   if (TREE_CODE (len) != INTEGER_CST)
1503     return false;
1504 
1505   /* Now, we must be passed a constant src ptr parameter.  */
1506   tree slen = get_maxval_strlen (src, 0);
1507   if (!slen || TREE_CODE (slen) != INTEGER_CST)
1508     return false;
1509 
1510   slen = size_binop_loc (loc, PLUS_EXPR, slen, ssize_int (1));
1511 
1512   /* We do not support simplification of this case, though we do
1513      support it when expanding trees into RTL.  */
1514   /* FIXME: generate a call to __builtin_memset.  */
1515   if (tree_int_cst_lt (slen, len))
1516     return false;
1517 
1518   /* OK transform into builtin memcpy.  */
1519   fn = builtin_decl_implicit (BUILT_IN_MEMCPY);
1520   if (!fn)
1521     return false;
1522 
1523   len = fold_convert_loc (loc, size_type_node, len);
1524   len = force_gimple_operand_gsi (gsi, len, true,
1525 				  NULL_TREE, true, GSI_SAME_STMT);
1526   gimple repl = gimple_build_call (fn, 3, dest, src, len);
1527   replace_call_with_call_and_fold (gsi, repl);
1528   return true;
1529 }
1530 
1531 /* Simplify a call to the strcat builtin.  DST and SRC are the arguments
1532    to the call.
1533 
1534    Return NULL_TREE if no simplification was possible, otherwise return the
1535    simplified form of the call as a tree.
1536 
1537    The simplified form may be a constant or other expression which
1538    computes the same value, but in a more efficient manner (including
1539    calls to other builtin functions).
1540 
1541    The call may contain arguments which need to be evaluated, but
1542    which are not useful to determine the result of the call.  In
1543    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
1544    COMPOUND_EXPR will be an argument which must be evaluated.
1545    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
1546    COMPOUND_EXPR in the chain will contain the tree for the simplified
1547    form of the builtin function call.  */
1548 
1549 static bool
1550 gimple_fold_builtin_strcat (gimple_stmt_iterator *gsi, tree dst, tree src)
1551 {
1552   gimple stmt = gsi_stmt (*gsi);
1553   location_t loc = gimple_location (stmt);
1554 
1555   const char *p = c_getstr (src);
1556 
1557   /* If the string length is zero, return the dst parameter.  */
1558   if (p && *p == '\0')
1559     {
1560       replace_call_with_value (gsi, dst);
1561       return true;
1562     }
1563 
1564   if (!optimize_bb_for_speed_p (gimple_bb (stmt)))
1565     return false;
1566 
1567   /* See if we can store by pieces into (dst + strlen(dst)).  */
1568   tree newdst;
1569   tree strlen_fn = builtin_decl_implicit (BUILT_IN_STRLEN);
1570   tree memcpy_fn = builtin_decl_implicit (BUILT_IN_MEMCPY);
1571 
1572   if (!strlen_fn || !memcpy_fn)
1573     return false;
1574 
1575   /* If the length of the source string isn't computable don't
1576      split strcat into strlen and memcpy.  */
1577   tree len = get_maxval_strlen (src, 0);
1578   if (! len)
1579     return false;
1580 
1581   /* Create strlen (dst).  */
1582   gimple_seq stmts = NULL, stmts2;
1583   gimple repl = gimple_build_call (strlen_fn, 1, dst);
1584   gimple_set_location (repl, loc);
1585   if (gimple_in_ssa_p (cfun))
1586     newdst = make_ssa_name (size_type_node);
1587   else
1588     newdst = create_tmp_reg (size_type_node);
1589   gimple_call_set_lhs (repl, newdst);
1590   gimple_seq_add_stmt_without_update (&stmts, repl);
1591 
1592   /* Create (dst p+ strlen (dst)).  */
1593   newdst = fold_build_pointer_plus_loc (loc, dst, newdst);
1594   newdst = force_gimple_operand (newdst, &stmts2, true, NULL_TREE);
1595   gimple_seq_add_seq_without_update (&stmts, stmts2);
1596 
1597   len = fold_convert_loc (loc, size_type_node, len);
1598   len = size_binop_loc (loc, PLUS_EXPR, len,
1599 			build_int_cst (size_type_node, 1));
1600   len = force_gimple_operand (len, &stmts2, true, NULL_TREE);
1601   gimple_seq_add_seq_without_update (&stmts, stmts2);
1602 
1603   repl = gimple_build_call (memcpy_fn, 3, newdst, src, len);
1604   gimple_seq_add_stmt_without_update (&stmts, repl);
1605   if (gimple_call_lhs (stmt))
1606     {
1607       repl = gimple_build_assign (gimple_call_lhs (stmt), dst);
1608       gimple_seq_add_stmt_without_update (&stmts, repl);
1609       gsi_replace_with_seq_vops (gsi, stmts);
1610       /* gsi now points at the assignment to the lhs, get a
1611          stmt iterator to the memcpy call.
1612 	 ???  We can't use gsi_for_stmt as that doesn't work when the
1613 	 CFG isn't built yet.  */
1614       gimple_stmt_iterator gsi2 = *gsi;
1615       gsi_prev (&gsi2);
1616       fold_stmt (&gsi2);
1617     }
1618   else
1619     {
1620       gsi_replace_with_seq_vops (gsi, stmts);
1621       fold_stmt (gsi);
1622     }
1623   return true;
1624 }
1625 
1626 /* Fold a call to the __strcat_chk builtin FNDECL.  DEST, SRC, and SIZE
1627    are the arguments to the call.  */
1628 
1629 static bool
1630 gimple_fold_builtin_strcat_chk (gimple_stmt_iterator *gsi)
1631 {
1632   gimple stmt = gsi_stmt (*gsi);
1633   tree dest = gimple_call_arg (stmt, 0);
1634   tree src = gimple_call_arg (stmt, 1);
1635   tree size = gimple_call_arg (stmt, 2);
1636   tree fn;
1637   const char *p;
1638 
1639 
1640   p = c_getstr (src);
1641   /* If the SRC parameter is "", return DEST.  */
1642   if (p && *p == '\0')
1643     {
1644       replace_call_with_value (gsi, dest);
1645       return true;
1646     }
1647 
1648   if (! tree_fits_uhwi_p (size) || ! integer_all_onesp (size))
1649     return false;
1650 
1651   /* If __builtin_strcat_chk is used, assume strcat is available.  */
1652   fn = builtin_decl_explicit (BUILT_IN_STRCAT);
1653   if (!fn)
1654     return false;
1655 
1656   gimple repl = gimple_build_call (fn, 2, dest, src);
1657   replace_call_with_call_and_fold (gsi, repl);
1658   return true;
1659 }
1660 
1661 /* Simplify a call to the strncat builtin.  */
1662 
1663 static bool
1664 gimple_fold_builtin_strncat (gimple_stmt_iterator *gsi)
1665 {
1666   gcall *stmt = as_a <gcall *> (gsi_stmt (*gsi));
1667   tree dst = gimple_call_arg (stmt, 0);
1668   tree src = gimple_call_arg (stmt, 1);
1669   tree len = gimple_call_arg (stmt, 2);
1670 
1671   const char *p = c_getstr (src);
1672 
1673   /* If the requested length is zero, or the src parameter string
1674      length is zero, return the dst parameter.  */
1675   if (integer_zerop (len) || (p && *p == '\0'))
1676     {
1677       replace_call_with_value (gsi, dst);
1678       return true;
1679     }
1680 
1681   /* If the requested len is greater than or equal to the string
1682      length, call strcat.  */
1683   if (TREE_CODE (len) == INTEGER_CST && p
1684       && compare_tree_int (len, strlen (p)) >= 0)
1685     {
1686       tree fn = builtin_decl_implicit (BUILT_IN_STRCAT);
1687 
1688       /* If the replacement _DECL isn't initialized, don't do the
1689 	 transformation.  */
1690       if (!fn)
1691 	return false;
1692 
1693       gcall *repl = gimple_build_call (fn, 2, dst, src);
1694       replace_call_with_call_and_fold (gsi, repl);
1695       return true;
1696     }
1697 
1698   return false;
1699 }
1700 
1701 /* Fold a call to the __strncat_chk builtin with arguments DEST, SRC,
1702    LEN, and SIZE.  */
1703 
1704 static bool
1705 gimple_fold_builtin_strncat_chk (gimple_stmt_iterator *gsi)
1706 {
1707   gimple stmt = gsi_stmt (*gsi);
1708   tree dest = gimple_call_arg (stmt, 0);
1709   tree src = gimple_call_arg (stmt, 1);
1710   tree len = gimple_call_arg (stmt, 2);
1711   tree size = gimple_call_arg (stmt, 3);
1712   tree fn;
1713   const char *p;
1714 
1715   p = c_getstr (src);
1716   /* If the SRC parameter is "" or if LEN is 0, return DEST.  */
1717   if ((p && *p == '\0')
1718       || integer_zerop (len))
1719     {
1720       replace_call_with_value (gsi, dest);
1721       return true;
1722     }
1723 
1724   if (! tree_fits_uhwi_p (size))
1725     return false;
1726 
1727   if (! integer_all_onesp (size))
1728     {
1729       tree src_len = c_strlen (src, 1);
1730       if (src_len
1731 	  && tree_fits_uhwi_p (src_len)
1732 	  && tree_fits_uhwi_p (len)
1733 	  && ! tree_int_cst_lt (len, src_len))
1734 	{
1735 	  /* If LEN >= strlen (SRC), optimize into __strcat_chk.  */
1736 	  fn = builtin_decl_explicit (BUILT_IN_STRCAT_CHK);
1737 	  if (!fn)
1738 	    return false;
1739 
1740 	  gimple repl = gimple_build_call (fn, 3, dest, src, size);
1741 	  replace_call_with_call_and_fold (gsi, repl);
1742 	  return true;
1743 	}
1744       return false;
1745     }
1746 
1747   /* If __builtin_strncat_chk is used, assume strncat is available.  */
1748   fn = builtin_decl_explicit (BUILT_IN_STRNCAT);
1749   if (!fn)
1750     return false;
1751 
1752   gimple repl = gimple_build_call (fn, 3, dest, src, len);
1753   replace_call_with_call_and_fold (gsi, repl);
1754   return true;
1755 }
1756 
1757 /* Fold a call to the fputs builtin.  ARG0 and ARG1 are the arguments
1758    to the call.  IGNORE is true if the value returned
1759    by the builtin will be ignored.  UNLOCKED is true is true if this
1760    actually a call to fputs_unlocked.  If LEN in non-NULL, it represents
1761    the known length of the string.  Return NULL_TREE if no simplification
1762    was possible.  */
1763 
1764 static bool
1765 gimple_fold_builtin_fputs (gimple_stmt_iterator *gsi,
1766 			   tree arg0, tree arg1,
1767 			   bool unlocked)
1768 {
1769   gimple stmt = gsi_stmt (*gsi);
1770 
1771   /* If we're using an unlocked function, assume the other unlocked
1772      functions exist explicitly.  */
1773   tree const fn_fputc = (unlocked
1774 			 ? builtin_decl_explicit (BUILT_IN_FPUTC_UNLOCKED)
1775 			 : builtin_decl_implicit (BUILT_IN_FPUTC));
1776   tree const fn_fwrite = (unlocked
1777 			  ? builtin_decl_explicit (BUILT_IN_FWRITE_UNLOCKED)
1778 			  : builtin_decl_implicit (BUILT_IN_FWRITE));
1779 
1780   /* If the return value is used, don't do the transformation.  */
1781   if (gimple_call_lhs (stmt))
1782     return false;
1783 
1784   /* Get the length of the string passed to fputs.  If the length
1785      can't be determined, punt.  */
1786   tree len = get_maxval_strlen (arg0, 0);
1787   if (!len
1788       || TREE_CODE (len) != INTEGER_CST)
1789     return false;
1790 
1791   switch (compare_tree_int (len, 1))
1792     {
1793     case -1: /* length is 0, delete the call entirely .  */
1794       replace_call_with_value (gsi, integer_zero_node);
1795       return true;
1796 
1797     case 0: /* length is 1, call fputc.  */
1798       {
1799 	const char *p = c_getstr (arg0);
1800 	if (p != NULL)
1801 	  {
1802 	    if (!fn_fputc)
1803 	      return false;
1804 
1805 	    gimple repl = gimple_build_call (fn_fputc, 2,
1806 					     build_int_cst
1807 					     (integer_type_node, p[0]), arg1);
1808 	    replace_call_with_call_and_fold (gsi, repl);
1809 	    return true;
1810 	  }
1811       }
1812       /* FALLTHROUGH */
1813     case 1: /* length is greater than 1, call fwrite.  */
1814       {
1815 	/* If optimizing for size keep fputs.  */
1816 	if (optimize_function_for_size_p (cfun))
1817 	  return false;
1818 	/* New argument list transforming fputs(string, stream) to
1819 	   fwrite(string, 1, len, stream).  */
1820 	if (!fn_fwrite)
1821 	  return false;
1822 
1823 	gimple repl = gimple_build_call (fn_fwrite, 4, arg0,
1824 					 size_one_node, len, arg1);
1825 	replace_call_with_call_and_fold (gsi, repl);
1826 	return true;
1827       }
1828     default:
1829       gcc_unreachable ();
1830     }
1831   return false;
1832 }
1833 
1834 /* Fold a call to the __mem{cpy,pcpy,move,set}_chk builtin.
1835    DEST, SRC, LEN, and SIZE are the arguments to the call.
1836    IGNORE is true, if return value can be ignored.  FCODE is the BUILT_IN_*
1837    code of the builtin.  If MAXLEN is not NULL, it is maximum length
1838    passed as third argument.  */
1839 
1840 static bool
1841 gimple_fold_builtin_memory_chk (gimple_stmt_iterator *gsi,
1842 				tree dest, tree src, tree len, tree size,
1843 				enum built_in_function fcode)
1844 {
1845   gimple stmt = gsi_stmt (*gsi);
1846   location_t loc = gimple_location (stmt);
1847   bool ignore = gimple_call_lhs (stmt) == NULL_TREE;
1848   tree fn;
1849 
1850   /* If SRC and DEST are the same (and not volatile), return DEST
1851      (resp. DEST+LEN for __mempcpy_chk).  */
1852   if (fcode != BUILT_IN_MEMSET_CHK && operand_equal_p (src, dest, 0))
1853     {
1854       if (fcode != BUILT_IN_MEMPCPY_CHK)
1855 	{
1856 	  replace_call_with_value (gsi, dest);
1857 	  return true;
1858 	}
1859       else
1860 	{
1861 	  tree temp = fold_build_pointer_plus_loc (loc, dest, len);
1862 	  temp = force_gimple_operand_gsi (gsi, temp,
1863 					   false, NULL_TREE, true,
1864 					   GSI_SAME_STMT);
1865 	  replace_call_with_value (gsi, temp);
1866 	  return true;
1867 	}
1868     }
1869 
1870   if (! tree_fits_uhwi_p (size))
1871     return false;
1872 
1873   tree maxlen = get_maxval_strlen (len, 2);
1874   if (! integer_all_onesp (size))
1875     {
1876       if (! tree_fits_uhwi_p (len))
1877 	{
1878 	  /* If LEN is not constant, try MAXLEN too.
1879 	     For MAXLEN only allow optimizing into non-_ocs function
1880 	     if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
1881 	  if (maxlen == NULL_TREE || ! tree_fits_uhwi_p (maxlen))
1882 	    {
1883 	      if (fcode == BUILT_IN_MEMPCPY_CHK && ignore)
1884 		{
1885 		  /* (void) __mempcpy_chk () can be optimized into
1886 		     (void) __memcpy_chk ().  */
1887 		  fn = builtin_decl_explicit (BUILT_IN_MEMCPY_CHK);
1888 		  if (!fn)
1889 		    return false;
1890 
1891 		  gimple repl = gimple_build_call (fn, 4, dest, src, len, size);
1892 		  replace_call_with_call_and_fold (gsi, repl);
1893 		  return true;
1894 		}
1895 	      return false;
1896 	    }
1897 	}
1898       else
1899 	maxlen = len;
1900 
1901       if (tree_int_cst_lt (size, maxlen))
1902 	return false;
1903     }
1904 
1905   fn = NULL_TREE;
1906   /* If __builtin_mem{cpy,pcpy,move,set}_chk is used, assume
1907      mem{cpy,pcpy,move,set} is available.  */
1908   switch (fcode)
1909     {
1910     case BUILT_IN_MEMCPY_CHK:
1911       fn = builtin_decl_explicit (BUILT_IN_MEMCPY);
1912       break;
1913     case BUILT_IN_MEMPCPY_CHK:
1914       fn = builtin_decl_explicit (BUILT_IN_MEMPCPY);
1915       break;
1916     case BUILT_IN_MEMMOVE_CHK:
1917       fn = builtin_decl_explicit (BUILT_IN_MEMMOVE);
1918       break;
1919     case BUILT_IN_MEMSET_CHK:
1920       fn = builtin_decl_explicit (BUILT_IN_MEMSET);
1921       break;
1922     default:
1923       break;
1924     }
1925 
1926   if (!fn)
1927     return false;
1928 
1929   gimple repl = gimple_build_call (fn, 3, dest, src, len);
1930   replace_call_with_call_and_fold (gsi, repl);
1931   return true;
1932 }
1933 
1934 /* Fold a call to the __st[rp]cpy_chk builtin.
1935    DEST, SRC, and SIZE are the arguments to the call.
1936    IGNORE is true if return value can be ignored.  FCODE is the BUILT_IN_*
1937    code of the builtin.  If MAXLEN is not NULL, it is maximum length of
1938    strings passed as second argument.  */
1939 
1940 static bool
1941 gimple_fold_builtin_stxcpy_chk (gimple_stmt_iterator *gsi,
1942 				tree dest,
1943 				tree src, tree size,
1944 				enum built_in_function fcode)
1945 {
1946   gimple stmt = gsi_stmt (*gsi);
1947   location_t loc = gimple_location (stmt);
1948   bool ignore = gimple_call_lhs (stmt) == NULL_TREE;
1949   tree len, fn;
1950 
1951   /* If SRC and DEST are the same (and not volatile), return DEST.  */
1952   if (fcode == BUILT_IN_STRCPY_CHK && operand_equal_p (src, dest, 0))
1953     {
1954       replace_call_with_value (gsi, dest);
1955       return true;
1956     }
1957 
1958   if (! tree_fits_uhwi_p (size))
1959     return false;
1960 
1961   tree maxlen = get_maxval_strlen (src, 1);
1962   if (! integer_all_onesp (size))
1963     {
1964       len = c_strlen (src, 1);
1965       if (! len || ! tree_fits_uhwi_p (len))
1966 	{
1967 	  /* If LEN is not constant, try MAXLEN too.
1968 	     For MAXLEN only allow optimizing into non-_ocs function
1969 	     if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
1970 	  if (maxlen == NULL_TREE || ! tree_fits_uhwi_p (maxlen))
1971 	    {
1972 	      if (fcode == BUILT_IN_STPCPY_CHK)
1973 		{
1974 		  if (! ignore)
1975 		    return false;
1976 
1977 		  /* If return value of __stpcpy_chk is ignored,
1978 		     optimize into __strcpy_chk.  */
1979 		  fn = builtin_decl_explicit (BUILT_IN_STRCPY_CHK);
1980 		  if (!fn)
1981 		    return false;
1982 
1983 		  gimple repl = gimple_build_call (fn, 3, dest, src, size);
1984 		  replace_call_with_call_and_fold (gsi, repl);
1985 		  return true;
1986 		}
1987 
1988 	      if (! len || TREE_SIDE_EFFECTS (len))
1989 		return false;
1990 
1991 	      /* If c_strlen returned something, but not a constant,
1992 		 transform __strcpy_chk into __memcpy_chk.  */
1993 	      fn = builtin_decl_explicit (BUILT_IN_MEMCPY_CHK);
1994 	      if (!fn)
1995 		return false;
1996 
1997 	      len = fold_convert_loc (loc, size_type_node, len);
1998 	      len = size_binop_loc (loc, PLUS_EXPR, len,
1999 				    build_int_cst (size_type_node, 1));
2000 	      len = force_gimple_operand_gsi (gsi, len, true, NULL_TREE,
2001 					      true, GSI_SAME_STMT);
2002 	      gimple repl = gimple_build_call (fn, 4, dest, src, len, size);
2003 	      replace_call_with_call_and_fold (gsi, repl);
2004 	      return true;
2005 	    }
2006 	}
2007       else
2008 	maxlen = len;
2009 
2010       if (! tree_int_cst_lt (maxlen, size))
2011 	return false;
2012     }
2013 
2014   /* If __builtin_st{r,p}cpy_chk is used, assume st{r,p}cpy is available.  */
2015   fn = builtin_decl_explicit (fcode == BUILT_IN_STPCPY_CHK
2016 			      ? BUILT_IN_STPCPY : BUILT_IN_STRCPY);
2017   if (!fn)
2018     return false;
2019 
2020   gimple repl = gimple_build_call (fn, 2, dest, src);
2021   replace_call_with_call_and_fold (gsi, repl);
2022   return true;
2023 }
2024 
2025 /* Fold a call to the __st{r,p}ncpy_chk builtin.  DEST, SRC, LEN, and SIZE
2026    are the arguments to the call.  If MAXLEN is not NULL, it is maximum
2027    length passed as third argument. IGNORE is true if return value can be
2028    ignored. FCODE is the BUILT_IN_* code of the builtin. */
2029 
2030 static bool
2031 gimple_fold_builtin_stxncpy_chk (gimple_stmt_iterator *gsi,
2032 				 tree dest, tree src,
2033 				 tree len, tree size,
2034 				 enum built_in_function fcode)
2035 {
2036   gimple stmt = gsi_stmt (*gsi);
2037   bool ignore = gimple_call_lhs (stmt) == NULL_TREE;
2038   tree fn;
2039 
2040   if (fcode == BUILT_IN_STPNCPY_CHK && ignore)
2041     {
2042        /* If return value of __stpncpy_chk is ignored,
2043           optimize into __strncpy_chk.  */
2044        fn = builtin_decl_explicit (BUILT_IN_STRNCPY_CHK);
2045        if (fn)
2046 	 {
2047 	   gimple repl = gimple_build_call (fn, 4, dest, src, len, size);
2048 	   replace_call_with_call_and_fold (gsi, repl);
2049 	   return true;
2050 	 }
2051     }
2052 
2053   if (! tree_fits_uhwi_p (size))
2054     return false;
2055 
2056   tree maxlen = get_maxval_strlen (len, 2);
2057   if (! integer_all_onesp (size))
2058     {
2059       if (! tree_fits_uhwi_p (len))
2060 	{
2061 	  /* If LEN is not constant, try MAXLEN too.
2062 	     For MAXLEN only allow optimizing into non-_ocs function
2063 	     if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
2064 	  if (maxlen == NULL_TREE || ! tree_fits_uhwi_p (maxlen))
2065 	    return false;
2066 	}
2067       else
2068 	maxlen = len;
2069 
2070       if (tree_int_cst_lt (size, maxlen))
2071 	return false;
2072     }
2073 
2074   /* If __builtin_st{r,p}ncpy_chk is used, assume st{r,p}ncpy is available.  */
2075   fn = builtin_decl_explicit (fcode == BUILT_IN_STPNCPY_CHK
2076 			      ? BUILT_IN_STPNCPY : BUILT_IN_STRNCPY);
2077   if (!fn)
2078     return false;
2079 
2080   gimple repl = gimple_build_call (fn, 3, dest, src, len);
2081   replace_call_with_call_and_fold (gsi, repl);
2082   return true;
2083 }
2084 
2085 /* Fold function call to builtin stpcpy with arguments DEST and SRC.
2086    Return NULL_TREE if no simplification can be made.  */
2087 
2088 static bool
2089 gimple_fold_builtin_stpcpy (gimple_stmt_iterator *gsi)
2090 {
2091   gcall *stmt = as_a <gcall *> (gsi_stmt (*gsi));
2092   location_t loc = gimple_location (stmt);
2093   tree dest = gimple_call_arg (stmt, 0);
2094   tree src = gimple_call_arg (stmt, 1);
2095   tree fn, len, lenp1;
2096 
2097   /* If the result is unused, replace stpcpy with strcpy.  */
2098   if (gimple_call_lhs (stmt) == NULL_TREE)
2099     {
2100       tree fn = builtin_decl_implicit (BUILT_IN_STRCPY);
2101       if (!fn)
2102 	return false;
2103       gimple_call_set_fndecl (stmt, fn);
2104       fold_stmt (gsi);
2105       return true;
2106     }
2107 
2108   len = c_strlen (src, 1);
2109   if (!len
2110       || TREE_CODE (len) != INTEGER_CST)
2111     return false;
2112 
2113   if (optimize_function_for_size_p (cfun)
2114       /* If length is zero it's small enough.  */
2115       && !integer_zerop (len))
2116     return false;
2117 
2118   /* If the source has a known length replace stpcpy with memcpy.  */
2119   fn = builtin_decl_implicit (BUILT_IN_MEMCPY);
2120   if (!fn)
2121     return false;
2122 
2123   gimple_seq stmts = NULL;
2124   tree tem = gimple_convert (&stmts, loc, size_type_node, len);
2125   lenp1 = gimple_build (&stmts, loc, PLUS_EXPR, size_type_node,
2126 			tem, build_int_cst (size_type_node, 1));
2127   gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
2128   gcall *repl = gimple_build_call (fn, 3, dest, src, lenp1);
2129   gimple_set_vuse (repl, gimple_vuse (stmt));
2130   gimple_set_vdef (repl, gimple_vdef (stmt));
2131   if (gimple_vdef (repl)
2132       && TREE_CODE (gimple_vdef (repl)) == SSA_NAME)
2133     SSA_NAME_DEF_STMT (gimple_vdef (repl)) = repl;
2134   gsi_insert_before (gsi, repl, GSI_SAME_STMT);
2135   /* Replace the result with dest + len.  */
2136   stmts = NULL;
2137   tem = gimple_convert (&stmts, loc, sizetype, len);
2138   gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
2139   gassign *ret = gimple_build_assign (gimple_call_lhs (stmt),
2140 				      POINTER_PLUS_EXPR, dest, tem);
2141   gsi_replace (gsi, ret, false);
2142   /* Finally fold the memcpy call.  */
2143   gimple_stmt_iterator gsi2 = *gsi;
2144   gsi_prev (&gsi2);
2145   fold_stmt (&gsi2);
2146   return true;
2147 }
2148 
2149 /* Fold a call EXP to {,v}snprintf having NARGS passed as ARGS.  Return
2150    NULL_TREE if a normal call should be emitted rather than expanding
2151    the function inline.  FCODE is either BUILT_IN_SNPRINTF_CHK or
2152    BUILT_IN_VSNPRINTF_CHK.  If MAXLEN is not NULL, it is maximum length
2153    passed as second argument.  */
2154 
2155 static bool
2156 gimple_fold_builtin_snprintf_chk (gimple_stmt_iterator *gsi,
2157 				  enum built_in_function fcode)
2158 {
2159   gcall *stmt = as_a <gcall *> (gsi_stmt (*gsi));
2160   tree dest, size, len, fn, fmt, flag;
2161   const char *fmt_str;
2162 
2163   /* Verify the required arguments in the original call.  */
2164   if (gimple_call_num_args (stmt) < 5)
2165     return false;
2166 
2167   dest = gimple_call_arg (stmt, 0);
2168   len = gimple_call_arg (stmt, 1);
2169   flag = gimple_call_arg (stmt, 2);
2170   size = gimple_call_arg (stmt, 3);
2171   fmt = gimple_call_arg (stmt, 4);
2172 
2173   if (! tree_fits_uhwi_p (size))
2174     return false;
2175 
2176   if (! integer_all_onesp (size))
2177     {
2178       tree maxlen = get_maxval_strlen (len, 2);
2179       if (! tree_fits_uhwi_p (len))
2180 	{
2181 	  /* If LEN is not constant, try MAXLEN too.
2182 	     For MAXLEN only allow optimizing into non-_ocs function
2183 	     if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
2184 	  if (maxlen == NULL_TREE || ! tree_fits_uhwi_p (maxlen))
2185 	    return false;
2186 	}
2187       else
2188 	maxlen = len;
2189 
2190       if (tree_int_cst_lt (size, maxlen))
2191 	return false;
2192     }
2193 
2194   if (!init_target_chars ())
2195     return false;
2196 
2197   /* Only convert __{,v}snprintf_chk to {,v}snprintf if flag is 0
2198      or if format doesn't contain % chars or is "%s".  */
2199   if (! integer_zerop (flag))
2200     {
2201       fmt_str = c_getstr (fmt);
2202       if (fmt_str == NULL)
2203 	return false;
2204       if (strchr (fmt_str, target_percent) != NULL
2205 	  && strcmp (fmt_str, target_percent_s))
2206 	return false;
2207     }
2208 
2209   /* If __builtin_{,v}snprintf_chk is used, assume {,v}snprintf is
2210      available.  */
2211   fn = builtin_decl_explicit (fcode == BUILT_IN_VSNPRINTF_CHK
2212 			      ? BUILT_IN_VSNPRINTF : BUILT_IN_SNPRINTF);
2213   if (!fn)
2214     return false;
2215 
2216   /* Replace the called function and the first 5 argument by 3 retaining
2217      trailing varargs.  */
2218   gimple_call_set_fndecl (stmt, fn);
2219   gimple_call_set_fntype (stmt, TREE_TYPE (fn));
2220   gimple_call_set_arg (stmt, 0, dest);
2221   gimple_call_set_arg (stmt, 1, len);
2222   gimple_call_set_arg (stmt, 2, fmt);
2223   for (unsigned i = 3; i < gimple_call_num_args (stmt) - 2; ++i)
2224     gimple_call_set_arg (stmt, i, gimple_call_arg (stmt, i + 2));
2225   gimple_set_num_ops (stmt, gimple_num_ops (stmt) - 2);
2226   fold_stmt (gsi);
2227   return true;
2228 }
2229 
2230 /* Fold a call EXP to __{,v}sprintf_chk having NARGS passed as ARGS.
2231    Return NULL_TREE if a normal call should be emitted rather than
2232    expanding the function inline.  FCODE is either BUILT_IN_SPRINTF_CHK
2233    or BUILT_IN_VSPRINTF_CHK.  */
2234 
2235 static bool
2236 gimple_fold_builtin_sprintf_chk (gimple_stmt_iterator *gsi,
2237 				 enum built_in_function fcode)
2238 {
2239   gcall *stmt = as_a <gcall *> (gsi_stmt (*gsi));
2240   tree dest, size, len, fn, fmt, flag;
2241   const char *fmt_str;
2242   unsigned nargs = gimple_call_num_args (stmt);
2243 
2244   /* Verify the required arguments in the original call.  */
2245   if (nargs < 4)
2246     return false;
2247   dest = gimple_call_arg (stmt, 0);
2248   flag = gimple_call_arg (stmt, 1);
2249   size = gimple_call_arg (stmt, 2);
2250   fmt = gimple_call_arg (stmt, 3);
2251 
2252   if (! tree_fits_uhwi_p (size))
2253     return false;
2254 
2255   len = NULL_TREE;
2256 
2257   if (!init_target_chars ())
2258     return false;
2259 
2260   /* Check whether the format is a literal string constant.  */
2261   fmt_str = c_getstr (fmt);
2262   if (fmt_str != NULL)
2263     {
2264       /* If the format doesn't contain % args or %%, we know the size.  */
2265       if (strchr (fmt_str, target_percent) == 0)
2266 	{
2267 	  if (fcode != BUILT_IN_SPRINTF_CHK || nargs == 4)
2268 	    len = build_int_cstu (size_type_node, strlen (fmt_str));
2269 	}
2270       /* If the format is "%s" and first ... argument is a string literal,
2271 	 we know the size too.  */
2272       else if (fcode == BUILT_IN_SPRINTF_CHK
2273 	       && strcmp (fmt_str, target_percent_s) == 0)
2274 	{
2275 	  tree arg;
2276 
2277 	  if (nargs == 5)
2278 	    {
2279 	      arg = gimple_call_arg (stmt, 4);
2280 	      if (POINTER_TYPE_P (TREE_TYPE (arg)))
2281 		{
2282 		  len = c_strlen (arg, 1);
2283 		  if (! len || ! tree_fits_uhwi_p (len))
2284 		    len = NULL_TREE;
2285 		}
2286 	    }
2287 	}
2288     }
2289 
2290   if (! integer_all_onesp (size))
2291     {
2292       if (! len || ! tree_int_cst_lt (len, size))
2293 	return false;
2294     }
2295 
2296   /* Only convert __{,v}sprintf_chk to {,v}sprintf if flag is 0
2297      or if format doesn't contain % chars or is "%s".  */
2298   if (! integer_zerop (flag))
2299     {
2300       if (fmt_str == NULL)
2301 	return false;
2302       if (strchr (fmt_str, target_percent) != NULL
2303 	  && strcmp (fmt_str, target_percent_s))
2304 	return false;
2305     }
2306 
2307   /* If __builtin_{,v}sprintf_chk is used, assume {,v}sprintf is available.  */
2308   fn = builtin_decl_explicit (fcode == BUILT_IN_VSPRINTF_CHK
2309 			      ? BUILT_IN_VSPRINTF : BUILT_IN_SPRINTF);
2310   if (!fn)
2311     return false;
2312 
2313   /* Replace the called function and the first 4 argument by 2 retaining
2314      trailing varargs.  */
2315   gimple_call_set_fndecl (stmt, fn);
2316   gimple_call_set_fntype (stmt, TREE_TYPE (fn));
2317   gimple_call_set_arg (stmt, 0, dest);
2318   gimple_call_set_arg (stmt, 1, fmt);
2319   for (unsigned i = 2; i < gimple_call_num_args (stmt) - 2; ++i)
2320     gimple_call_set_arg (stmt, i, gimple_call_arg (stmt, i + 2));
2321   gimple_set_num_ops (stmt, gimple_num_ops (stmt) - 2);
2322   fold_stmt (gsi);
2323   return true;
2324 }
2325 
2326 /* Simplify a call to the sprintf builtin with arguments DEST, FMT, and ORIG.
2327    ORIG may be null if this is a 2-argument call.  We don't attempt to
2328    simplify calls with more than 3 arguments.
2329 
2330    Return NULL_TREE if no simplification was possible, otherwise return the
2331    simplified form of the call as a tree.  If IGNORED is true, it means that
2332    the caller does not use the returned value of the function.  */
2333 
2334 static bool
2335 gimple_fold_builtin_sprintf (gimple_stmt_iterator *gsi)
2336 {
2337   gimple stmt = gsi_stmt (*gsi);
2338   tree dest = gimple_call_arg (stmt, 0);
2339   tree fmt = gimple_call_arg (stmt, 1);
2340   tree orig = NULL_TREE;
2341   const char *fmt_str = NULL;
2342 
2343   /* Verify the required arguments in the original call.  We deal with two
2344      types of sprintf() calls: 'sprintf (str, fmt)' and
2345      'sprintf (dest, "%s", orig)'.  */
2346   if (gimple_call_num_args (stmt) > 3)
2347     return false;
2348 
2349   if (gimple_call_num_args (stmt) == 3)
2350     orig = gimple_call_arg (stmt, 2);
2351 
2352   /* Check whether the format is a literal string constant.  */
2353   fmt_str = c_getstr (fmt);
2354   if (fmt_str == NULL)
2355     return false;
2356 
2357   if (!init_target_chars ())
2358     return false;
2359 
2360   /* If the format doesn't contain % args or %%, use strcpy.  */
2361   if (strchr (fmt_str, target_percent) == NULL)
2362     {
2363       tree fn = builtin_decl_implicit (BUILT_IN_STRCPY);
2364 
2365       if (!fn)
2366 	return false;
2367 
2368       /* Don't optimize sprintf (buf, "abc", ptr++).  */
2369       if (orig)
2370 	return false;
2371 
2372       /* Convert sprintf (str, fmt) into strcpy (str, fmt) when
2373 	 'format' is known to contain no % formats.  */
2374       gimple_seq stmts = NULL;
2375       gimple repl = gimple_build_call (fn, 2, dest, fmt);
2376       gimple_seq_add_stmt_without_update (&stmts, repl);
2377       if (gimple_call_lhs (stmt))
2378 	{
2379 	  repl = gimple_build_assign (gimple_call_lhs (stmt),
2380 				      build_int_cst (integer_type_node,
2381 						     strlen (fmt_str)));
2382 	  gimple_seq_add_stmt_without_update (&stmts, repl);
2383 	  gsi_replace_with_seq_vops (gsi, stmts);
2384 	  /* gsi now points at the assignment to the lhs, get a
2385 	     stmt iterator to the memcpy call.
2386 	     ???  We can't use gsi_for_stmt as that doesn't work when the
2387 	     CFG isn't built yet.  */
2388 	  gimple_stmt_iterator gsi2 = *gsi;
2389 	  gsi_prev (&gsi2);
2390 	  fold_stmt (&gsi2);
2391 	}
2392       else
2393 	{
2394 	  gsi_replace_with_seq_vops (gsi, stmts);
2395 	  fold_stmt (gsi);
2396 	}
2397       return true;
2398     }
2399 
2400   /* If the format is "%s", use strcpy if the result isn't used.  */
2401   else if (fmt_str && strcmp (fmt_str, target_percent_s) == 0)
2402     {
2403       tree fn;
2404       fn = builtin_decl_implicit (BUILT_IN_STRCPY);
2405 
2406       if (!fn)
2407 	return false;
2408 
2409       /* Don't crash on sprintf (str1, "%s").  */
2410       if (!orig)
2411 	return false;
2412 
2413       tree orig_len = NULL_TREE;
2414       if (gimple_call_lhs (stmt))
2415 	{
2416 	  orig_len = get_maxval_strlen (orig, 0);
2417 	  if (!orig_len)
2418 	    return false;
2419 	}
2420 
2421       /* Convert sprintf (str1, "%s", str2) into strcpy (str1, str2).  */
2422       gimple_seq stmts = NULL;
2423       gimple repl = gimple_build_call (fn, 2, dest, orig);
2424       gimple_seq_add_stmt_without_update (&stmts, repl);
2425       if (gimple_call_lhs (stmt))
2426 	{
2427 	  if (!useless_type_conversion_p (integer_type_node,
2428 					  TREE_TYPE (orig_len)))
2429 	    orig_len = fold_convert (integer_type_node, orig_len);
2430 	  repl = gimple_build_assign (gimple_call_lhs (stmt), orig_len);
2431 	  gimple_seq_add_stmt_without_update (&stmts, repl);
2432 	  gsi_replace_with_seq_vops (gsi, stmts);
2433 	  /* gsi now points at the assignment to the lhs, get a
2434 	     stmt iterator to the memcpy call.
2435 	     ???  We can't use gsi_for_stmt as that doesn't work when the
2436 	     CFG isn't built yet.  */
2437 	  gimple_stmt_iterator gsi2 = *gsi;
2438 	  gsi_prev (&gsi2);
2439 	  fold_stmt (&gsi2);
2440 	}
2441       else
2442 	{
2443 	  gsi_replace_with_seq_vops (gsi, stmts);
2444 	  fold_stmt (gsi);
2445 	}
2446       return true;
2447     }
2448   return false;
2449 }
2450 
2451 /* Simplify a call to the snprintf builtin with arguments DEST, DESTSIZE,
2452    FMT, and ORIG.  ORIG may be null if this is a 3-argument call.  We don't
2453    attempt to simplify calls with more than 4 arguments.
2454 
2455    Return NULL_TREE if no simplification was possible, otherwise return the
2456    simplified form of the call as a tree.  If IGNORED is true, it means that
2457    the caller does not use the returned value of the function.  */
2458 
2459 static bool
2460 gimple_fold_builtin_snprintf (gimple_stmt_iterator *gsi)
2461 {
2462   gcall *stmt = as_a <gcall *> (gsi_stmt (*gsi));
2463   tree dest = gimple_call_arg (stmt, 0);
2464   tree destsize = gimple_call_arg (stmt, 1);
2465   tree fmt = gimple_call_arg (stmt, 2);
2466   tree orig = NULL_TREE;
2467   const char *fmt_str = NULL;
2468 
2469   if (gimple_call_num_args (stmt) > 4)
2470     return false;
2471 
2472   if (gimple_call_num_args (stmt) == 4)
2473     orig = gimple_call_arg (stmt, 3);
2474 
2475   if (!tree_fits_uhwi_p (destsize))
2476     return false;
2477   unsigned HOST_WIDE_INT destlen = tree_to_uhwi (destsize);
2478 
2479   /* Check whether the format is a literal string constant.  */
2480   fmt_str = c_getstr (fmt);
2481   if (fmt_str == NULL)
2482     return false;
2483 
2484   if (!init_target_chars ())
2485     return false;
2486 
2487   /* If the format doesn't contain % args or %%, use strcpy.  */
2488   if (strchr (fmt_str, target_percent) == NULL)
2489     {
2490       tree fn = builtin_decl_implicit (BUILT_IN_STRCPY);
2491       if (!fn)
2492 	return false;
2493 
2494       /* Don't optimize snprintf (buf, 4, "abc", ptr++).  */
2495       if (orig)
2496 	return false;
2497 
2498       /* We could expand this as
2499 	 memcpy (str, fmt, cst - 1); str[cst - 1] = '\0';
2500 	 or to
2501 	 memcpy (str, fmt_with_nul_at_cstm1, cst);
2502 	 but in the former case that might increase code size
2503 	 and in the latter case grow .rodata section too much.
2504 	 So punt for now.  */
2505       size_t len = strlen (fmt_str);
2506       if (len >= destlen)
2507 	return false;
2508 
2509       gimple_seq stmts = NULL;
2510       gimple repl = gimple_build_call (fn, 2, dest, fmt);
2511       gimple_seq_add_stmt_without_update (&stmts, repl);
2512       if (gimple_call_lhs (stmt))
2513 	{
2514 	  repl = gimple_build_assign (gimple_call_lhs (stmt),
2515 				      build_int_cst (integer_type_node, len));
2516 	  gimple_seq_add_stmt_without_update (&stmts, repl);
2517 	  gsi_replace_with_seq_vops (gsi, stmts);
2518 	  /* gsi now points at the assignment to the lhs, get a
2519 	     stmt iterator to the memcpy call.
2520 	     ???  We can't use gsi_for_stmt as that doesn't work when the
2521 	     CFG isn't built yet.  */
2522 	  gimple_stmt_iterator gsi2 = *gsi;
2523 	  gsi_prev (&gsi2);
2524 	  fold_stmt (&gsi2);
2525 	}
2526       else
2527 	{
2528 	  gsi_replace_with_seq_vops (gsi, stmts);
2529 	  fold_stmt (gsi);
2530 	}
2531       return true;
2532     }
2533 
2534   /* If the format is "%s", use strcpy if the result isn't used.  */
2535   else if (fmt_str && strcmp (fmt_str, target_percent_s) == 0)
2536     {
2537       tree fn = builtin_decl_implicit (BUILT_IN_STRCPY);
2538       if (!fn)
2539 	return false;
2540 
2541       /* Don't crash on snprintf (str1, cst, "%s").  */
2542       if (!orig)
2543 	return false;
2544 
2545       tree orig_len = get_maxval_strlen (orig, 0);
2546       if (!orig_len || TREE_CODE (orig_len) != INTEGER_CST)
2547 	return false;
2548 
2549       /* We could expand this as
2550 	 memcpy (str1, str2, cst - 1); str1[cst - 1] = '\0';
2551 	 or to
2552 	 memcpy (str1, str2_with_nul_at_cstm1, cst);
2553 	 but in the former case that might increase code size
2554 	 and in the latter case grow .rodata section too much.
2555 	 So punt for now.  */
2556       if (compare_tree_int (orig_len, destlen) >= 0)
2557 	return false;
2558 
2559       /* Convert snprintf (str1, cst, "%s", str2) into
2560 	 strcpy (str1, str2) if strlen (str2) < cst.  */
2561       gimple_seq stmts = NULL;
2562       gimple repl = gimple_build_call (fn, 2, dest, orig);
2563       gimple_seq_add_stmt_without_update (&stmts, repl);
2564       if (gimple_call_lhs (stmt))
2565 	{
2566 	  if (!useless_type_conversion_p (integer_type_node,
2567 					  TREE_TYPE (orig_len)))
2568 	    orig_len = fold_convert (integer_type_node, orig_len);
2569 	  repl = gimple_build_assign (gimple_call_lhs (stmt), orig_len);
2570 	  gimple_seq_add_stmt_without_update (&stmts, repl);
2571 	  gsi_replace_with_seq_vops (gsi, stmts);
2572 	  /* gsi now points at the assignment to the lhs, get a
2573 	     stmt iterator to the memcpy call.
2574 	     ???  We can't use gsi_for_stmt as that doesn't work when the
2575 	     CFG isn't built yet.  */
2576 	  gimple_stmt_iterator gsi2 = *gsi;
2577 	  gsi_prev (&gsi2);
2578 	  fold_stmt (&gsi2);
2579 	}
2580       else
2581 	{
2582 	  gsi_replace_with_seq_vops (gsi, stmts);
2583 	  fold_stmt (gsi);
2584 	}
2585       return true;
2586     }
2587   return false;
2588 }
2589 
2590 /* Fold a call to the {,v}fprintf{,_unlocked} and __{,v}printf_chk builtins.
2591    FP, FMT, and ARG are the arguments to the call.  We don't fold calls with
2592    more than 3 arguments, and ARG may be null in the 2-argument case.
2593 
2594    Return NULL_TREE if no simplification was possible, otherwise return the
2595    simplified form of the call as a tree.  FCODE is the BUILT_IN_*
2596    code of the function to be simplified.  */
2597 
2598 static bool
2599 gimple_fold_builtin_fprintf (gimple_stmt_iterator *gsi,
2600 			     tree fp, tree fmt, tree arg,
2601 			     enum built_in_function fcode)
2602 {
2603   gcall *stmt = as_a <gcall *> (gsi_stmt (*gsi));
2604   tree fn_fputc, fn_fputs;
2605   const char *fmt_str = NULL;
2606 
2607   /* If the return value is used, don't do the transformation.  */
2608   if (gimple_call_lhs (stmt) != NULL_TREE)
2609     return false;
2610 
2611   /* Check whether the format is a literal string constant.  */
2612   fmt_str = c_getstr (fmt);
2613   if (fmt_str == NULL)
2614     return false;
2615 
2616   if (fcode == BUILT_IN_FPRINTF_UNLOCKED)
2617     {
2618       /* If we're using an unlocked function, assume the other
2619 	 unlocked functions exist explicitly.  */
2620       fn_fputc = builtin_decl_explicit (BUILT_IN_FPUTC_UNLOCKED);
2621       fn_fputs = builtin_decl_explicit (BUILT_IN_FPUTS_UNLOCKED);
2622     }
2623   else
2624     {
2625       fn_fputc = builtin_decl_implicit (BUILT_IN_FPUTC);
2626       fn_fputs = builtin_decl_implicit (BUILT_IN_FPUTS);
2627     }
2628 
2629   if (!init_target_chars ())
2630     return false;
2631 
2632   /* If the format doesn't contain % args or %%, use strcpy.  */
2633   if (strchr (fmt_str, target_percent) == NULL)
2634     {
2635       if (fcode != BUILT_IN_VFPRINTF && fcode != BUILT_IN_VFPRINTF_CHK
2636 	  && arg)
2637 	return false;
2638 
2639       /* If the format specifier was "", fprintf does nothing.  */
2640       if (fmt_str[0] == '\0')
2641 	{
2642 	  replace_call_with_value (gsi, NULL_TREE);
2643 	  return true;
2644 	}
2645 
2646       /* When "string" doesn't contain %, replace all cases of
2647 	 fprintf (fp, string) with fputs (string, fp).  The fputs
2648 	 builtin will take care of special cases like length == 1.  */
2649       if (fn_fputs)
2650 	{
2651 	  gcall *repl = gimple_build_call (fn_fputs, 2, fmt, fp);
2652 	  replace_call_with_call_and_fold (gsi, repl);
2653 	  return true;
2654 	}
2655     }
2656 
2657   /* The other optimizations can be done only on the non-va_list variants.  */
2658   else if (fcode == BUILT_IN_VFPRINTF || fcode == BUILT_IN_VFPRINTF_CHK)
2659     return false;
2660 
2661   /* If the format specifier was "%s", call __builtin_fputs (arg, fp).  */
2662   else if (strcmp (fmt_str, target_percent_s) == 0)
2663     {
2664       if (!arg || ! POINTER_TYPE_P (TREE_TYPE (arg)))
2665 	return false;
2666       if (fn_fputs)
2667 	{
2668 	  gcall *repl = gimple_build_call (fn_fputs, 2, arg, fp);
2669 	  replace_call_with_call_and_fold (gsi, repl);
2670 	  return true;
2671 	}
2672     }
2673 
2674   /* If the format specifier was "%c", call __builtin_fputc (arg, fp).  */
2675   else if (strcmp (fmt_str, target_percent_c) == 0)
2676     {
2677       if (!arg
2678 	  || ! useless_type_conversion_p (integer_type_node, TREE_TYPE (arg)))
2679 	return false;
2680       if (fn_fputc)
2681 	{
2682 	  gcall *repl = gimple_build_call (fn_fputc, 2, arg, fp);
2683 	  replace_call_with_call_and_fold (gsi, repl);
2684 	  return true;
2685 	}
2686     }
2687 
2688   return false;
2689 }
2690 
2691 /* Fold a call to the {,v}printf{,_unlocked} and __{,v}printf_chk builtins.
2692    FMT and ARG are the arguments to the call; we don't fold cases with
2693    more than 2 arguments, and ARG may be null if this is a 1-argument case.
2694 
2695    Return NULL_TREE if no simplification was possible, otherwise return the
2696    simplified form of the call as a tree.  FCODE is the BUILT_IN_*
2697    code of the function to be simplified.  */
2698 
2699 static bool
2700 gimple_fold_builtin_printf (gimple_stmt_iterator *gsi, tree fmt,
2701 			    tree arg, enum built_in_function fcode)
2702 {
2703   gcall *stmt = as_a <gcall *> (gsi_stmt (*gsi));
2704   tree fn_putchar, fn_puts, newarg;
2705   const char *fmt_str = NULL;
2706 
2707   /* If the return value is used, don't do the transformation.  */
2708   if (gimple_call_lhs (stmt) != NULL_TREE)
2709     return false;
2710 
2711   /* Check whether the format is a literal string constant.  */
2712   fmt_str = c_getstr (fmt);
2713   if (fmt_str == NULL)
2714     return false;
2715 
2716   if (fcode == BUILT_IN_PRINTF_UNLOCKED)
2717     {
2718       /* If we're using an unlocked function, assume the other
2719 	 unlocked functions exist explicitly.  */
2720       fn_putchar = builtin_decl_explicit (BUILT_IN_PUTCHAR_UNLOCKED);
2721       fn_puts = builtin_decl_explicit (BUILT_IN_PUTS_UNLOCKED);
2722     }
2723   else
2724     {
2725       fn_putchar = builtin_decl_implicit (BUILT_IN_PUTCHAR);
2726       fn_puts = builtin_decl_implicit (BUILT_IN_PUTS);
2727     }
2728 
2729   if (!init_target_chars ())
2730     return false;
2731 
2732   if (strcmp (fmt_str, target_percent_s) == 0
2733       || strchr (fmt_str, target_percent) == NULL)
2734     {
2735       const char *str;
2736 
2737       if (strcmp (fmt_str, target_percent_s) == 0)
2738 	{
2739 	  if (fcode == BUILT_IN_VPRINTF || fcode == BUILT_IN_VPRINTF_CHK)
2740 	    return false;
2741 
2742 	  if (!arg || ! POINTER_TYPE_P (TREE_TYPE (arg)))
2743 	    return false;
2744 
2745 	  str = c_getstr (arg);
2746 	  if (str == NULL)
2747 	    return false;
2748 	}
2749       else
2750 	{
2751 	  /* The format specifier doesn't contain any '%' characters.  */
2752 	  if (fcode != BUILT_IN_VPRINTF && fcode != BUILT_IN_VPRINTF_CHK
2753 	      && arg)
2754 	    return false;
2755 	  str = fmt_str;
2756 	}
2757 
2758       /* If the string was "", printf does nothing.  */
2759       if (str[0] == '\0')
2760 	{
2761 	  replace_call_with_value (gsi, NULL_TREE);
2762 	  return true;
2763 	}
2764 
2765       /* If the string has length of 1, call putchar.  */
2766       if (str[1] == '\0')
2767 	{
2768 	  /* Given printf("c"), (where c is any one character,)
2769 	     convert "c"[0] to an int and pass that to the replacement
2770 	     function.  */
2771 	  newarg = build_int_cst (integer_type_node, str[0]);
2772 	  if (fn_putchar)
2773 	    {
2774 	      gcall *repl = gimple_build_call (fn_putchar, 1, newarg);
2775 	      replace_call_with_call_and_fold (gsi, repl);
2776 	      return true;
2777 	    }
2778 	}
2779       else
2780 	{
2781 	  /* If the string was "string\n", call puts("string").  */
2782 	  size_t len = strlen (str);
2783 	  if ((unsigned char)str[len - 1] == target_newline
2784 	      && (size_t) (int) len == len
2785 	      && (int) len > 0)
2786 	    {
2787 	      char *newstr;
2788 	      tree offset_node, string_cst;
2789 
2790 	      /* Create a NUL-terminated string that's one char shorter
2791 		 than the original, stripping off the trailing '\n'.  */
2792 	      newarg = build_string_literal (len, str);
2793 	      string_cst = string_constant (newarg, &offset_node);
2794 	      gcc_checking_assert (string_cst
2795 				   && (TREE_STRING_LENGTH (string_cst)
2796 				       == (int) len)
2797 				   && integer_zerop (offset_node)
2798 				   && (unsigned char)
2799 				      TREE_STRING_POINTER (string_cst)[len - 1]
2800 				      == target_newline);
2801 	      /* build_string_literal creates a new STRING_CST,
2802 		 modify it in place to avoid double copying.  */
2803 	      newstr = CONST_CAST (char *, TREE_STRING_POINTER (string_cst));
2804 	      newstr[len - 1] = '\0';
2805 	      if (fn_puts)
2806 		{
2807 		  gcall *repl = gimple_build_call (fn_puts, 1, newarg);
2808 		  replace_call_with_call_and_fold (gsi, repl);
2809 		  return true;
2810 		}
2811 	    }
2812 	  else
2813 	    /* We'd like to arrange to call fputs(string,stdout) here,
2814 	       but we need stdout and don't have a way to get it yet.  */
2815 	    return false;
2816 	}
2817     }
2818 
2819   /* The other optimizations can be done only on the non-va_list variants.  */
2820   else if (fcode == BUILT_IN_VPRINTF || fcode == BUILT_IN_VPRINTF_CHK)
2821     return false;
2822 
2823   /* If the format specifier was "%s\n", call __builtin_puts(arg).  */
2824   else if (strcmp (fmt_str, target_percent_s_newline) == 0)
2825     {
2826       if (!arg || ! POINTER_TYPE_P (TREE_TYPE (arg)))
2827 	return false;
2828       if (fn_puts)
2829 	{
2830 	  gcall *repl = gimple_build_call (fn_puts, 1, arg);
2831 	  replace_call_with_call_and_fold (gsi, repl);
2832 	  return true;
2833 	}
2834     }
2835 
2836   /* If the format specifier was "%c", call __builtin_putchar(arg).  */
2837   else if (strcmp (fmt_str, target_percent_c) == 0)
2838     {
2839       if (!arg || ! useless_type_conversion_p (integer_type_node,
2840 					       TREE_TYPE (arg)))
2841 	return false;
2842       if (fn_putchar)
2843 	{
2844 	  gcall *repl = gimple_build_call (fn_putchar, 1, arg);
2845 	  replace_call_with_call_and_fold (gsi, repl);
2846 	  return true;
2847 	}
2848     }
2849 
2850   return false;
2851 }
2852 
2853 
2854 
2855 /* Fold a call to __builtin_strlen with known length LEN.  */
2856 
2857 static bool
2858 gimple_fold_builtin_strlen (gimple_stmt_iterator *gsi)
2859 {
2860   gimple stmt = gsi_stmt (*gsi);
2861   tree len = get_maxval_strlen (gimple_call_arg (stmt, 0), 0);
2862   if (!len)
2863     return false;
2864   len = force_gimple_operand_gsi (gsi, len, true, NULL, true, GSI_SAME_STMT);
2865   replace_call_with_value (gsi, len);
2866   return true;
2867 }
2868 
2869 
2870 /* Fold the non-target builtin at *GSI and return whether any simplification
2871    was made.  */
2872 
2873 static bool
2874 gimple_fold_builtin (gimple_stmt_iterator *gsi)
2875 {
2876   gcall *stmt = as_a <gcall *>(gsi_stmt (*gsi));
2877   tree callee = gimple_call_fndecl (stmt);
2878 
2879   /* Give up for always_inline inline builtins until they are
2880      inlined.  */
2881   if (avoid_folding_inline_builtin (callee))
2882     return false;
2883 
2884   unsigned n = gimple_call_num_args (stmt);
2885   enum built_in_function fcode = DECL_FUNCTION_CODE (callee);
2886   switch (fcode)
2887     {
2888     case BUILT_IN_BZERO:
2889       return gimple_fold_builtin_memset (gsi, integer_zero_node,
2890 					 gimple_call_arg (stmt, 1));
2891     case BUILT_IN_MEMSET:
2892       return gimple_fold_builtin_memset (gsi,
2893 					 gimple_call_arg (stmt, 1),
2894 					 gimple_call_arg (stmt, 2));
2895     case BUILT_IN_BCOPY:
2896       return gimple_fold_builtin_memory_op (gsi, gimple_call_arg (stmt, 1),
2897 					    gimple_call_arg (stmt, 0), 3);
2898     case BUILT_IN_MEMCPY:
2899       return gimple_fold_builtin_memory_op (gsi, gimple_call_arg (stmt, 0),
2900 					    gimple_call_arg (stmt, 1), 0);
2901     case BUILT_IN_MEMPCPY:
2902       return gimple_fold_builtin_memory_op (gsi, gimple_call_arg (stmt, 0),
2903 					    gimple_call_arg (stmt, 1), 1);
2904     case BUILT_IN_MEMMOVE:
2905       return gimple_fold_builtin_memory_op (gsi, gimple_call_arg (stmt, 0),
2906 					    gimple_call_arg (stmt, 1), 3);
2907     case BUILT_IN_SPRINTF_CHK:
2908     case BUILT_IN_VSPRINTF_CHK:
2909       return gimple_fold_builtin_sprintf_chk (gsi, fcode);
2910     case BUILT_IN_STRCAT_CHK:
2911       return gimple_fold_builtin_strcat_chk (gsi);
2912     case BUILT_IN_STRNCAT_CHK:
2913       return gimple_fold_builtin_strncat_chk (gsi);
2914     case BUILT_IN_STRLEN:
2915       return gimple_fold_builtin_strlen (gsi);
2916     case BUILT_IN_STRCPY:
2917       return gimple_fold_builtin_strcpy (gsi,
2918 					 gimple_call_arg (stmt, 0),
2919 					 gimple_call_arg (stmt, 1));
2920     case BUILT_IN_STRNCPY:
2921       return gimple_fold_builtin_strncpy (gsi,
2922 					  gimple_call_arg (stmt, 0),
2923 					  gimple_call_arg (stmt, 1),
2924 					  gimple_call_arg (stmt, 2));
2925     case BUILT_IN_STRCAT:
2926       return gimple_fold_builtin_strcat (gsi, gimple_call_arg (stmt, 0),
2927 					 gimple_call_arg (stmt, 1));
2928     case BUILT_IN_STRNCAT:
2929       return gimple_fold_builtin_strncat (gsi);
2930     case BUILT_IN_FPUTS:
2931       return gimple_fold_builtin_fputs (gsi, gimple_call_arg (stmt, 0),
2932 					gimple_call_arg (stmt, 1), false);
2933     case BUILT_IN_FPUTS_UNLOCKED:
2934       return gimple_fold_builtin_fputs (gsi, gimple_call_arg (stmt, 0),
2935 					gimple_call_arg (stmt, 1), true);
2936     case BUILT_IN_MEMCPY_CHK:
2937     case BUILT_IN_MEMPCPY_CHK:
2938     case BUILT_IN_MEMMOVE_CHK:
2939     case BUILT_IN_MEMSET_CHK:
2940       return gimple_fold_builtin_memory_chk (gsi,
2941 					     gimple_call_arg (stmt, 0),
2942 					     gimple_call_arg (stmt, 1),
2943 					     gimple_call_arg (stmt, 2),
2944 					     gimple_call_arg (stmt, 3),
2945 					     fcode);
2946     case BUILT_IN_STPCPY:
2947       return gimple_fold_builtin_stpcpy (gsi);
2948     case BUILT_IN_STRCPY_CHK:
2949     case BUILT_IN_STPCPY_CHK:
2950       return gimple_fold_builtin_stxcpy_chk (gsi,
2951 					     gimple_call_arg (stmt, 0),
2952 					     gimple_call_arg (stmt, 1),
2953 					     gimple_call_arg (stmt, 2),
2954 					     fcode);
2955     case BUILT_IN_STRNCPY_CHK:
2956     case BUILT_IN_STPNCPY_CHK:
2957       return gimple_fold_builtin_stxncpy_chk (gsi,
2958 					      gimple_call_arg (stmt, 0),
2959 					      gimple_call_arg (stmt, 1),
2960 					      gimple_call_arg (stmt, 2),
2961 					      gimple_call_arg (stmt, 3),
2962 					      fcode);
2963     case BUILT_IN_SNPRINTF_CHK:
2964     case BUILT_IN_VSNPRINTF_CHK:
2965       return gimple_fold_builtin_snprintf_chk (gsi, fcode);
2966     case BUILT_IN_SNPRINTF:
2967       return gimple_fold_builtin_snprintf (gsi);
2968     case BUILT_IN_SPRINTF:
2969       return gimple_fold_builtin_sprintf (gsi);
2970     case BUILT_IN_FPRINTF:
2971     case BUILT_IN_FPRINTF_UNLOCKED:
2972     case BUILT_IN_VFPRINTF:
2973       if (n == 2 || n == 3)
2974 	return gimple_fold_builtin_fprintf (gsi,
2975 					    gimple_call_arg (stmt, 0),
2976 					    gimple_call_arg (stmt, 1),
2977 					    n == 3
2978 					    ? gimple_call_arg (stmt, 2)
2979 					    : NULL_TREE,
2980 					    fcode);
2981       break;
2982     case BUILT_IN_FPRINTF_CHK:
2983     case BUILT_IN_VFPRINTF_CHK:
2984       if (n == 3 || n == 4)
2985 	return gimple_fold_builtin_fprintf (gsi,
2986 					    gimple_call_arg (stmt, 0),
2987 					    gimple_call_arg (stmt, 2),
2988 					    n == 4
2989 					    ? gimple_call_arg (stmt, 3)
2990 					    : NULL_TREE,
2991 					    fcode);
2992       break;
2993     case BUILT_IN_PRINTF:
2994     case BUILT_IN_PRINTF_UNLOCKED:
2995     case BUILT_IN_VPRINTF:
2996       if (n == 1 || n == 2)
2997 	return gimple_fold_builtin_printf (gsi, gimple_call_arg (stmt, 0),
2998 					   n == 2
2999 					   ? gimple_call_arg (stmt, 1)
3000 					   : NULL_TREE, fcode);
3001       break;
3002     case BUILT_IN_PRINTF_CHK:
3003     case BUILT_IN_VPRINTF_CHK:
3004       if (n == 2 || n == 3)
3005 	return gimple_fold_builtin_printf (gsi, gimple_call_arg (stmt, 1),
3006 					   n == 3
3007 					   ? gimple_call_arg (stmt, 2)
3008 					   : NULL_TREE, fcode);
3009     default:;
3010     }
3011 
3012   /* Try the generic builtin folder.  */
3013   bool ignore = (gimple_call_lhs (stmt) == NULL);
3014   tree result = fold_call_stmt (stmt, ignore);
3015   if (result)
3016     {
3017       if (ignore)
3018 	STRIP_NOPS (result);
3019       else
3020 	result = fold_convert (gimple_call_return_type (stmt), result);
3021       if (!update_call_from_tree (gsi, result))
3022 	gimplify_and_update_call_from_tree (gsi, result);
3023       return true;
3024     }
3025 
3026   return false;
3027 }
3028 
3029 /* Return true if ARG0 CODE ARG1 in infinite signed precision operation
3030    doesn't fit into TYPE.  The test for overflow should be regardless of
3031    -fwrapv, and even for unsigned types.  */
3032 
3033 bool
3034 arith_overflowed_p (enum tree_code code, const_tree type,
3035 		    const_tree arg0, const_tree arg1)
3036 {
3037   typedef FIXED_WIDE_INT (WIDE_INT_MAX_PRECISION * 2) widest2_int;
3038   typedef generic_wide_int <wi::extended_tree <WIDE_INT_MAX_PRECISION * 2> >
3039     widest2_int_cst;
3040   widest2_int warg0 = widest2_int_cst (arg0);
3041   widest2_int warg1 = widest2_int_cst (arg1);
3042   widest2_int wres;
3043   switch (code)
3044     {
3045     case PLUS_EXPR: wres = wi::add (warg0, warg1); break;
3046     case MINUS_EXPR: wres = wi::sub (warg0, warg1); break;
3047     case MULT_EXPR: wres = wi::mul (warg0, warg1); break;
3048     default: gcc_unreachable ();
3049     }
3050   signop sign = TYPE_SIGN (type);
3051   if (sign == UNSIGNED && wi::neg_p (wres))
3052     return true;
3053   return wi::min_precision (wres, sign) > TYPE_PRECISION (type);
3054 }
3055 
3056 /* Attempt to fold a call statement referenced by the statement iterator GSI.
3057    The statement may be replaced by another statement, e.g., if the call
3058    simplifies to a constant value. Return true if any changes were made.
3059    It is assumed that the operands have been previously folded.  */
3060 
3061 static bool
3062 gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)
3063 {
3064   gcall *stmt = as_a <gcall *> (gsi_stmt (*gsi));
3065   tree callee;
3066   bool changed = false;
3067   unsigned i;
3068 
3069   /* Fold *& in call arguments.  */
3070   for (i = 0; i < gimple_call_num_args (stmt); ++i)
3071     if (REFERENCE_CLASS_P (gimple_call_arg (stmt, i)))
3072       {
3073 	tree tmp = maybe_fold_reference (gimple_call_arg (stmt, i), false);
3074 	if (tmp)
3075 	  {
3076 	    gimple_call_set_arg (stmt, i, tmp);
3077 	    changed = true;
3078 	  }
3079       }
3080 
3081   /* Check for virtual calls that became direct calls.  */
3082   callee = gimple_call_fn (stmt);
3083   if (callee && TREE_CODE (callee) == OBJ_TYPE_REF)
3084     {
3085       if (gimple_call_addr_fndecl (OBJ_TYPE_REF_EXPR (callee)) != NULL_TREE)
3086 	{
3087           if (dump_file && virtual_method_call_p (callee)
3088 	      && !possible_polymorphic_call_target_p
3089 		    (callee, stmt, cgraph_node::get (gimple_call_addr_fndecl
3090 						     (OBJ_TYPE_REF_EXPR (callee)))))
3091 	    {
3092 	      fprintf (dump_file,
3093 		       "Type inheritance inconsistent devirtualization of ");
3094 	      print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
3095 	      fprintf (dump_file, " to ");
3096 	      print_generic_expr (dump_file, callee, TDF_SLIM);
3097 	      fprintf (dump_file, "\n");
3098 	    }
3099 
3100 	  gimple_call_set_fn (stmt, OBJ_TYPE_REF_EXPR (callee));
3101 	  changed = true;
3102 	}
3103       else if (flag_devirtualize && !inplace && virtual_method_call_p (callee))
3104 	{
3105 	  bool final;
3106 	  vec <cgraph_node *>targets
3107 	    = possible_polymorphic_call_targets (callee, stmt, &final);
3108 	  if (final && targets.length () <= 1 && dbg_cnt (devirt))
3109 	    {
3110 	      tree lhs = gimple_call_lhs (stmt);
3111 	      if (dump_enabled_p ())
3112 		{
3113 		  location_t loc = gimple_location_safe (stmt);
3114 		  dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
3115 				   "folding virtual function call to %s\n",
3116 		 		   targets.length () == 1
3117 		  		   ? targets[0]->name ()
3118 		  		   : "__builtin_unreachable");
3119 		}
3120 	      if (targets.length () == 1)
3121 		{
3122 		  gimple_call_set_fndecl (stmt, targets[0]->decl);
3123 		  changed = true;
3124 		  /* If the call becomes noreturn, remove the lhs.  */
3125 		  if (lhs && (gimple_call_flags (stmt) & ECF_NORETURN))
3126 		    {
3127 		      if (TREE_CODE (lhs) == SSA_NAME)
3128 			{
3129 			  tree var = create_tmp_var (TREE_TYPE (lhs));
3130 			  tree def = get_or_create_ssa_default_def (cfun, var);
3131 			  gimple new_stmt = gimple_build_assign (lhs, def);
3132 			  gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
3133 			}
3134 		      gimple_call_set_lhs (stmt, NULL_TREE);
3135 		    }
3136 		  maybe_remove_unused_call_args (cfun, stmt);
3137 		}
3138 	      else
3139 		{
3140 		  tree fndecl = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
3141 		  gimple new_stmt = gimple_build_call (fndecl, 0);
3142 		  gimple_set_location (new_stmt, gimple_location (stmt));
3143 		  if (lhs && TREE_CODE (lhs) == SSA_NAME)
3144 		    {
3145 		      tree var = create_tmp_var (TREE_TYPE (lhs));
3146 		      tree def = get_or_create_ssa_default_def (cfun, var);
3147 
3148 		      /* To satisfy condition for
3149 			 cgraph_update_edges_for_call_stmt_node,
3150 			 we need to preserve GIMPLE_CALL statement
3151 			 at position of GSI iterator.  */
3152 		      update_call_from_tree (gsi, def);
3153 		      gsi_insert_before (gsi, new_stmt, GSI_NEW_STMT);
3154 		    }
3155 		  else
3156 		    {
3157 		      gimple_set_vuse (new_stmt, gimple_vuse (stmt));
3158 		      gimple_set_vdef (new_stmt, gimple_vdef (stmt));
3159 		      gsi_replace (gsi, new_stmt, false);
3160 		    }
3161 		  return true;
3162 		}
3163 	    }
3164 	}
3165     }
3166 
3167   /* Check for indirect calls that became direct calls, and then
3168      no longer require a static chain.  */
3169   if (gimple_call_chain (stmt))
3170     {
3171       tree fn = gimple_call_fndecl (stmt);
3172       if (fn && !DECL_STATIC_CHAIN (fn))
3173 	{
3174 	  gimple_call_set_chain (stmt, NULL);
3175 	  changed = true;
3176 	}
3177       else
3178 	{
3179 	  tree tmp = maybe_fold_reference (gimple_call_chain (stmt), false);
3180 	  if (tmp)
3181 	    {
3182 	      gimple_call_set_chain (stmt, tmp);
3183 	      changed = true;
3184 	    }
3185 	}
3186     }
3187 
3188   if (inplace)
3189     return changed;
3190 
3191   /* Check for builtins that CCP can handle using information not
3192      available in the generic fold routines.  */
3193   if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
3194     {
3195       if (gimple_fold_builtin (gsi))
3196         changed = true;
3197     }
3198   else if (gimple_call_builtin_p (stmt, BUILT_IN_MD))
3199     {
3200 	changed |= targetm.gimple_fold_builtin (gsi);
3201     }
3202   else if (gimple_call_internal_p (stmt))
3203     {
3204       enum tree_code subcode = ERROR_MARK;
3205       tree result = NULL_TREE;
3206       bool cplx_result = false;
3207       tree overflow = NULL_TREE;
3208       switch (gimple_call_internal_fn (stmt))
3209 	{
3210 	case IFN_BUILTIN_EXPECT:
3211 	  result = fold_builtin_expect (gimple_location (stmt),
3212 					gimple_call_arg (stmt, 0),
3213 					gimple_call_arg (stmt, 1),
3214 					gimple_call_arg (stmt, 2));
3215 	  break;
3216 	case IFN_UBSAN_OBJECT_SIZE:
3217 	  if (integer_all_onesp (gimple_call_arg (stmt, 2))
3218 	      || (TREE_CODE (gimple_call_arg (stmt, 1)) == INTEGER_CST
3219 		  && TREE_CODE (gimple_call_arg (stmt, 2)) == INTEGER_CST
3220 		  && tree_int_cst_le (gimple_call_arg (stmt, 1),
3221 				      gimple_call_arg (stmt, 2))))
3222 	    {
3223 	      gsi_replace (gsi, gimple_build_nop (), false);
3224 	      unlink_stmt_vdef (stmt);
3225 	      release_defs (stmt);
3226 	      return true;
3227 	    }
3228 	  break;
3229 	case IFN_UBSAN_CHECK_ADD:
3230 	  subcode = PLUS_EXPR;
3231 	  break;
3232 	case IFN_UBSAN_CHECK_SUB:
3233 	  subcode = MINUS_EXPR;
3234 	  break;
3235 	case IFN_UBSAN_CHECK_MUL:
3236 	  subcode = MULT_EXPR;
3237 	  break;
3238 	case IFN_ADD_OVERFLOW:
3239 	  subcode = PLUS_EXPR;
3240 	  cplx_result = true;
3241 	  break;
3242 	case IFN_SUB_OVERFLOW:
3243 	  subcode = MINUS_EXPR;
3244 	  cplx_result = true;
3245 	  break;
3246 	case IFN_MUL_OVERFLOW:
3247 	  subcode = MULT_EXPR;
3248 	  cplx_result = true;
3249 	  break;
3250 	default:
3251 	  break;
3252 	}
3253       if (subcode != ERROR_MARK)
3254 	{
3255 	  tree arg0 = gimple_call_arg (stmt, 0);
3256 	  tree arg1 = gimple_call_arg (stmt, 1);
3257 	  tree type = TREE_TYPE (arg0);
3258 	  if (cplx_result)
3259 	    {
3260 	      tree lhs = gimple_call_lhs (stmt);
3261 	      if (lhs == NULL_TREE)
3262 		type = NULL_TREE;
3263 	      else
3264 		type = TREE_TYPE (TREE_TYPE (lhs));
3265 	    }
3266 	  if (type == NULL_TREE)
3267 	    ;
3268 	  /* x = y + 0; x = y - 0; x = y * 0; */
3269 	  else if (integer_zerop (arg1))
3270 	    result = subcode == MULT_EXPR ? integer_zero_node : arg0;
3271 	  /* x = 0 + y; x = 0 * y; */
3272 	  else if (subcode != MINUS_EXPR && integer_zerop (arg0))
3273 	    result = subcode == MULT_EXPR ? integer_zero_node : arg1;
3274 	  /* x = y - y; */
3275 	  else if (subcode == MINUS_EXPR && operand_equal_p (arg0, arg1, 0))
3276 	    result = integer_zero_node;
3277 	  /* x = y * 1; x = 1 * y; */
3278 	  else if (subcode == MULT_EXPR && integer_onep (arg1))
3279 	    result = arg0;
3280 	  else if (subcode == MULT_EXPR && integer_onep (arg0))
3281 	    result = arg1;
3282 	  else if (TREE_CODE (arg0) == INTEGER_CST
3283 		   && TREE_CODE (arg1) == INTEGER_CST)
3284 	    {
3285 	      if (cplx_result)
3286 		result = int_const_binop (subcode, fold_convert (type, arg0),
3287 					  fold_convert (type, arg1));
3288 	      else
3289 		result = int_const_binop (subcode, arg0, arg1);
3290 	      if (result && arith_overflowed_p (subcode, type, arg0, arg1))
3291 		{
3292 		  if (cplx_result)
3293 		    overflow = build_one_cst (type);
3294 		  else
3295 		    result = NULL_TREE;
3296 		}
3297 	    }
3298 	  if (result)
3299 	    {
3300 	      if (result == integer_zero_node)
3301 		result = build_zero_cst (type);
3302 	      else if (cplx_result && TREE_TYPE (result) != type)
3303 		{
3304 		  if (TREE_CODE (result) == INTEGER_CST)
3305 		    {
3306 		      if (arith_overflowed_p (PLUS_EXPR, type, result,
3307 					      integer_zero_node))
3308 			overflow = build_one_cst (type);
3309 		    }
3310 		  else if ((!TYPE_UNSIGNED (TREE_TYPE (result))
3311 			    && TYPE_UNSIGNED (type))
3312 			   || (TYPE_PRECISION (type)
3313 			       < (TYPE_PRECISION (TREE_TYPE (result))
3314 				  + (TYPE_UNSIGNED (TREE_TYPE (result))
3315 				     && !TYPE_UNSIGNED (type)))))
3316 		    result = NULL_TREE;
3317 		  if (result)
3318 		    result = fold_convert (type, result);
3319 		}
3320 	    }
3321 	}
3322 
3323       if (result)
3324 	{
3325 	  if (TREE_CODE (result) == INTEGER_CST && TREE_OVERFLOW (result))
3326 	    result = drop_tree_overflow (result);
3327 	  if (cplx_result)
3328 	    {
3329 	      if (overflow == NULL_TREE)
3330 		overflow = build_zero_cst (TREE_TYPE (result));
3331 	      tree ctype = build_complex_type (TREE_TYPE (result));
3332 	      if (TREE_CODE (result) == INTEGER_CST
3333 		  && TREE_CODE (overflow) == INTEGER_CST)
3334 		result = build_complex (ctype, result, overflow);
3335 	      else
3336 		result = build2_loc (gimple_location (stmt), COMPLEX_EXPR,
3337 				     ctype, result, overflow);
3338 	    }
3339 	  if (!update_call_from_tree (gsi, result))
3340 	    gimplify_and_update_call_from_tree (gsi, result);
3341 	  changed = true;
3342 	}
3343     }
3344 
3345   return changed;
3346 }
3347 
3348 
3349 /* Worker for fold_stmt_1 dispatch to pattern based folding with
3350    gimple_simplify.
3351 
3352    Replaces *GSI with the simplification result in RCODE and OPS
3353    and the associated statements in *SEQ.  Does the replacement
3354    according to INPLACE and returns true if the operation succeeded.  */
3355 
3356 static bool
3357 replace_stmt_with_simplification (gimple_stmt_iterator *gsi,
3358 				  code_helper rcode, tree *ops,
3359 				  gimple_seq *seq, bool inplace)
3360 {
3361   gimple stmt = gsi_stmt (*gsi);
3362 
3363   /* Play safe and do not allow abnormals to be mentioned in
3364      newly created statements.  See also maybe_push_res_to_seq.  */
3365   if ((TREE_CODE (ops[0]) == SSA_NAME
3366        && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[0]))
3367       || (ops[1]
3368 	  && TREE_CODE (ops[1]) == SSA_NAME
3369 	  && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[1]))
3370       || (ops[2]
3371 	  && TREE_CODE (ops[2]) == SSA_NAME
3372 	  && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ops[2])))
3373     return false;
3374 
3375   if (gcond *cond_stmt = dyn_cast <gcond *> (stmt))
3376     {
3377       gcc_assert (rcode.is_tree_code ());
3378       if (TREE_CODE_CLASS ((enum tree_code)rcode) == tcc_comparison
3379 	  /* GIMPLE_CONDs condition may not throw.  */
3380 	  && (!flag_exceptions
3381 	      || !cfun->can_throw_non_call_exceptions
3382 	      || !operation_could_trap_p (rcode,
3383 					  FLOAT_TYPE_P (TREE_TYPE (ops[0])),
3384 					  false, NULL_TREE)))
3385 	gimple_cond_set_condition (cond_stmt, rcode, ops[0], ops[1]);
3386       else if (rcode == SSA_NAME)
3387 	gimple_cond_set_condition (cond_stmt, NE_EXPR, ops[0],
3388 				   build_zero_cst (TREE_TYPE (ops[0])));
3389       else if (rcode == INTEGER_CST)
3390 	{
3391 	  if (integer_zerop (ops[0]))
3392 	    gimple_cond_make_false (cond_stmt);
3393 	  else
3394 	    gimple_cond_make_true (cond_stmt);
3395 	}
3396       else if (!inplace)
3397 	{
3398 	  tree res = maybe_push_res_to_seq (rcode, boolean_type_node,
3399 					    ops, seq);
3400 	  if (!res)
3401 	    return false;
3402 	  gimple_cond_set_condition (cond_stmt, NE_EXPR, res,
3403 				     build_zero_cst (TREE_TYPE (res)));
3404 	}
3405       else
3406 	return false;
3407       if (dump_file && (dump_flags & TDF_DETAILS))
3408 	{
3409 	  fprintf (dump_file, "gimple_simplified to ");
3410 	  if (!gimple_seq_empty_p (*seq))
3411 	    print_gimple_seq (dump_file, *seq, 0, TDF_SLIM);
3412 	  print_gimple_stmt (dump_file, gsi_stmt (*gsi),
3413 			     0, TDF_SLIM);
3414 	}
3415       gsi_insert_seq_before (gsi, *seq, GSI_SAME_STMT);
3416       return true;
3417     }
3418   else if (is_gimple_assign (stmt)
3419 	   && rcode.is_tree_code ())
3420     {
3421       if (!inplace
3422 	  || gimple_num_ops (stmt) > get_gimple_rhs_num_ops (rcode))
3423 	{
3424 	  maybe_build_generic_op (rcode,
3425 				  TREE_TYPE (gimple_assign_lhs (stmt)),
3426 				  &ops[0], ops[1], ops[2]);
3427 	  gimple_assign_set_rhs_with_ops (gsi, rcode, ops[0], ops[1], ops[2]);
3428 	  if (dump_file && (dump_flags & TDF_DETAILS))
3429 	    {
3430 	      fprintf (dump_file, "gimple_simplified to ");
3431 	      if (!gimple_seq_empty_p (*seq))
3432 		print_gimple_seq (dump_file, *seq, 0, TDF_SLIM);
3433 	      print_gimple_stmt (dump_file, gsi_stmt (*gsi),
3434 				 0, TDF_SLIM);
3435 	    }
3436 	  gsi_insert_seq_before (gsi, *seq, GSI_SAME_STMT);
3437 	  return true;
3438 	}
3439     }
3440   else if (!inplace)
3441     {
3442       if (gimple_has_lhs (stmt))
3443 	{
3444 	  tree lhs = gimple_get_lhs (stmt);
3445 	  if (!maybe_push_res_to_seq (rcode, TREE_TYPE (lhs),
3446 				      ops, seq, lhs))
3447 	    return false;
3448 	  if (dump_file && (dump_flags & TDF_DETAILS))
3449 	    {
3450 	      fprintf (dump_file, "gimple_simplified to ");
3451 	      print_gimple_seq (dump_file, *seq, 0, TDF_SLIM);
3452 	    }
3453 	  gsi_replace_with_seq_vops (gsi, *seq);
3454 	  return true;
3455 	}
3456       else
3457 	gcc_unreachable ();
3458     }
3459 
3460   return false;
3461 }
3462 
3463 /* Canonicalize MEM_REFs invariant address operand after propagation.  */
3464 
3465 static bool
3466 maybe_canonicalize_mem_ref_addr (tree *t)
3467 {
3468   bool res = false;
3469 
3470   if (TREE_CODE (*t) == ADDR_EXPR)
3471     t = &TREE_OPERAND (*t, 0);
3472 
3473   while (handled_component_p (*t))
3474     t = &TREE_OPERAND (*t, 0);
3475 
3476   /* Canonicalize MEM [&foo.bar, 0] which appears after propagating
3477      of invariant addresses into a SSA name MEM_REF address.  */
3478   if (TREE_CODE (*t) == MEM_REF
3479       || TREE_CODE (*t) == TARGET_MEM_REF)
3480     {
3481       tree addr = TREE_OPERAND (*t, 0);
3482       if (TREE_CODE (addr) == ADDR_EXPR
3483 	  && (TREE_CODE (TREE_OPERAND (addr, 0)) == MEM_REF
3484 	      || handled_component_p (TREE_OPERAND (addr, 0))))
3485 	{
3486 	  tree base;
3487 	  HOST_WIDE_INT coffset;
3488 	  base = get_addr_base_and_unit_offset (TREE_OPERAND (addr, 0),
3489 						&coffset);
3490 	  if (!base)
3491 	    gcc_unreachable ();
3492 
3493 	  TREE_OPERAND (*t, 0) = build_fold_addr_expr (base);
3494 	  TREE_OPERAND (*t, 1) = int_const_binop (PLUS_EXPR,
3495 						  TREE_OPERAND (*t, 1),
3496 						  size_int (coffset));
3497 	  res = true;
3498 	}
3499       gcc_checking_assert (TREE_CODE (TREE_OPERAND (*t, 0)) == DEBUG_EXPR_DECL
3500 			   || is_gimple_mem_ref_addr (TREE_OPERAND (*t, 0)));
3501     }
3502 
3503   /* Canonicalize back MEM_REFs to plain reference trees if the object
3504      accessed is a decl that has the same access semantics as the MEM_REF.  */
3505   if (TREE_CODE (*t) == MEM_REF
3506       && TREE_CODE (TREE_OPERAND (*t, 0)) == ADDR_EXPR
3507       && integer_zerop (TREE_OPERAND (*t, 1))
3508       && MR_DEPENDENCE_CLIQUE (*t) == 0)
3509     {
3510       tree decl = TREE_OPERAND (TREE_OPERAND (*t, 0), 0);
3511       tree alias_type = TREE_TYPE (TREE_OPERAND (*t, 1));
3512       if (/* Same volatile qualification.  */
3513 	  TREE_THIS_VOLATILE (*t) == TREE_THIS_VOLATILE (decl)
3514 	  /* Same TBAA behavior with -fstrict-aliasing.  */
3515 	  && !TYPE_REF_CAN_ALIAS_ALL (alias_type)
3516 	  && (TYPE_MAIN_VARIANT (TREE_TYPE (decl))
3517 	      == TYPE_MAIN_VARIANT (TREE_TYPE (alias_type)))
3518 	  /* Same alignment.  */
3519 	  && TYPE_ALIGN (TREE_TYPE (decl)) == TYPE_ALIGN (TREE_TYPE (*t))
3520 	  /* We have to look out here to not drop a required conversion
3521 	     from the rhs to the lhs if *t appears on the lhs or vice-versa
3522 	     if it appears on the rhs.  Thus require strict type
3523 	     compatibility.  */
3524 	  && types_compatible_p (TREE_TYPE (*t), TREE_TYPE (decl)))
3525 	{
3526 	  *t = TREE_OPERAND (TREE_OPERAND (*t, 0), 0);
3527 	  res = true;
3528 	}
3529     }
3530 
3531   /* Canonicalize TARGET_MEM_REF in particular with respect to
3532      the indexes becoming constant.  */
3533   else if (TREE_CODE (*t) == TARGET_MEM_REF)
3534     {
3535       tree tem = maybe_fold_tmr (*t);
3536       if (tem)
3537 	{
3538 	  *t = tem;
3539 	  res = true;
3540 	}
3541     }
3542 
3543   return res;
3544 }
3545 
3546 /* Worker for both fold_stmt and fold_stmt_inplace.  The INPLACE argument
3547    distinguishes both cases.  */
3548 
3549 static bool
3550 fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree))
3551 {
3552   bool changed = false;
3553   gimple stmt = gsi_stmt (*gsi);
3554   unsigned i;
3555 
3556   /* First do required canonicalization of [TARGET_]MEM_REF addresses
3557      after propagation.
3558      ???  This shouldn't be done in generic folding but in the
3559      propagation helpers which also know whether an address was
3560      propagated.  */
3561   switch (gimple_code (stmt))
3562     {
3563     case GIMPLE_ASSIGN:
3564       if (gimple_assign_rhs_class (stmt) == GIMPLE_SINGLE_RHS)
3565 	{
3566 	  tree *rhs = gimple_assign_rhs1_ptr (stmt);
3567 	  if ((REFERENCE_CLASS_P (*rhs)
3568 	       || TREE_CODE (*rhs) == ADDR_EXPR)
3569 	      && maybe_canonicalize_mem_ref_addr (rhs))
3570 	    changed = true;
3571 	  tree *lhs = gimple_assign_lhs_ptr (stmt);
3572 	  if (REFERENCE_CLASS_P (*lhs)
3573 	      && maybe_canonicalize_mem_ref_addr (lhs))
3574 	    changed = true;
3575 	}
3576       break;
3577     case GIMPLE_CALL:
3578       {
3579 	for (i = 0; i < gimple_call_num_args (stmt); ++i)
3580 	  {
3581 	    tree *arg = gimple_call_arg_ptr (stmt, i);
3582 	    if (REFERENCE_CLASS_P (*arg)
3583 		&& maybe_canonicalize_mem_ref_addr (arg))
3584 	      changed = true;
3585 	  }
3586 	tree *lhs = gimple_call_lhs_ptr (stmt);
3587 	if (*lhs
3588 	    && REFERENCE_CLASS_P (*lhs)
3589 	    && maybe_canonicalize_mem_ref_addr (lhs))
3590 	  changed = true;
3591 	break;
3592       }
3593     case GIMPLE_ASM:
3594       {
3595 	gasm *asm_stmt = as_a <gasm *> (stmt);
3596 	for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
3597 	  {
3598 	    tree link = gimple_asm_output_op (asm_stmt, i);
3599 	    tree op = TREE_VALUE (link);
3600 	    if (REFERENCE_CLASS_P (op)
3601 		&& maybe_canonicalize_mem_ref_addr (&TREE_VALUE (link)))
3602 	      changed = true;
3603 	  }
3604 	for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
3605 	  {
3606 	    tree link = gimple_asm_input_op (asm_stmt, i);
3607 	    tree op = TREE_VALUE (link);
3608 	    if ((REFERENCE_CLASS_P (op)
3609 		 || TREE_CODE (op) == ADDR_EXPR)
3610 		&& maybe_canonicalize_mem_ref_addr (&TREE_VALUE (link)))
3611 	      changed = true;
3612 	  }
3613       }
3614       break;
3615     case GIMPLE_DEBUG:
3616       if (gimple_debug_bind_p (stmt))
3617 	{
3618 	  tree *val = gimple_debug_bind_get_value_ptr (stmt);
3619 	  if (*val
3620 	      && (REFERENCE_CLASS_P (*val)
3621 		  || TREE_CODE (*val) == ADDR_EXPR)
3622 	      && maybe_canonicalize_mem_ref_addr (val))
3623 	    changed = true;
3624 	}
3625       break;
3626     default:;
3627     }
3628 
3629   /* Dispatch to pattern-based folding.  */
3630   if (!inplace
3631       || is_gimple_assign (stmt)
3632       || gimple_code (stmt) == GIMPLE_COND)
3633     {
3634       gimple_seq seq = NULL;
3635       code_helper rcode;
3636       tree ops[3] = {};
3637       if (gimple_simplify (stmt, &rcode, ops, inplace ? NULL : &seq, valueize))
3638 	{
3639 	  if (replace_stmt_with_simplification (gsi, rcode, ops, &seq, inplace))
3640 	    changed = true;
3641 	  else
3642 	    gimple_seq_discard (seq);
3643 	}
3644     }
3645 
3646   stmt = gsi_stmt (*gsi);
3647 
3648   /* Fold the main computation performed by the statement.  */
3649   switch (gimple_code (stmt))
3650     {
3651     case GIMPLE_ASSIGN:
3652       {
3653 	unsigned old_num_ops = gimple_num_ops (stmt);
3654 	enum tree_code subcode = gimple_assign_rhs_code (stmt);
3655 	tree lhs = gimple_assign_lhs (stmt);
3656 	tree new_rhs;
3657 	/* First canonicalize operand order.  This avoids building new
3658 	   trees if this is the only thing fold would later do.  */
3659 	if ((commutative_tree_code (subcode)
3660 	     || commutative_ternary_tree_code (subcode))
3661 	    && tree_swap_operands_p (gimple_assign_rhs1 (stmt),
3662 				     gimple_assign_rhs2 (stmt), false))
3663 	  {
3664 	    tree tem = gimple_assign_rhs1 (stmt);
3665 	    gimple_assign_set_rhs1 (stmt, gimple_assign_rhs2 (stmt));
3666 	    gimple_assign_set_rhs2 (stmt, tem);
3667 	    changed = true;
3668 	  }
3669 	new_rhs = fold_gimple_assign (gsi);
3670 	if (new_rhs
3671 	    && !useless_type_conversion_p (TREE_TYPE (lhs),
3672 					   TREE_TYPE (new_rhs)))
3673 	  new_rhs = fold_convert (TREE_TYPE (lhs), new_rhs);
3674 	if (new_rhs
3675 	    && (!inplace
3676 		|| get_gimple_rhs_num_ops (TREE_CODE (new_rhs)) < old_num_ops))
3677 	  {
3678 	    gimple_assign_set_rhs_from_tree (gsi, new_rhs);
3679 	    changed = true;
3680 	  }
3681 	break;
3682       }
3683 
3684     case GIMPLE_COND:
3685       changed |= fold_gimple_cond (as_a <gcond *> (stmt));
3686       break;
3687 
3688     case GIMPLE_CALL:
3689       changed |= gimple_fold_call (gsi, inplace);
3690       break;
3691 
3692     case GIMPLE_ASM:
3693       /* Fold *& in asm operands.  */
3694       {
3695 	gasm *asm_stmt = as_a <gasm *> (stmt);
3696 	size_t noutputs;
3697 	const char **oconstraints;
3698 	const char *constraint;
3699 	bool allows_mem, allows_reg;
3700 
3701 	noutputs = gimple_asm_noutputs (asm_stmt);
3702 	oconstraints = XALLOCAVEC (const char *, noutputs);
3703 
3704 	for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
3705 	  {
3706 	    tree link = gimple_asm_output_op (asm_stmt, i);
3707 	    tree op = TREE_VALUE (link);
3708 	    oconstraints[i]
3709 	      = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
3710 	    if (REFERENCE_CLASS_P (op)
3711 		&& (op = maybe_fold_reference (op, true)) != NULL_TREE)
3712 	      {
3713 		TREE_VALUE (link) = op;
3714 		changed = true;
3715 	      }
3716 	  }
3717 	for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
3718 	  {
3719 	    tree link = gimple_asm_input_op (asm_stmt, i);
3720 	    tree op = TREE_VALUE (link);
3721 	    constraint
3722 	      = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
3723 	    parse_input_constraint (&constraint, 0, 0, noutputs, 0,
3724 				    oconstraints, &allows_mem, &allows_reg);
3725 	    if (REFERENCE_CLASS_P (op)
3726 		&& (op = maybe_fold_reference (op, !allows_reg && allows_mem))
3727 		   != NULL_TREE)
3728 	      {
3729 		TREE_VALUE (link) = op;
3730 		changed = true;
3731 	      }
3732 	  }
3733       }
3734       break;
3735 
3736     case GIMPLE_DEBUG:
3737       if (gimple_debug_bind_p (stmt))
3738 	{
3739 	  tree val = gimple_debug_bind_get_value (stmt);
3740 	  if (val
3741 	      && REFERENCE_CLASS_P (val))
3742 	    {
3743 	      tree tem = maybe_fold_reference (val, false);
3744 	      if (tem)
3745 		{
3746 		  gimple_debug_bind_set_value (stmt, tem);
3747 		  changed = true;
3748 		}
3749 	    }
3750 	  else if (val
3751 		   && TREE_CODE (val) == ADDR_EXPR)
3752 	    {
3753 	      tree ref = TREE_OPERAND (val, 0);
3754 	      tree tem = maybe_fold_reference (ref, false);
3755 	      if (tem)
3756 		{
3757 		  tem = build_fold_addr_expr_with_type (tem, TREE_TYPE (val));
3758 		  gimple_debug_bind_set_value (stmt, tem);
3759 		  changed = true;
3760 		}
3761 	    }
3762 	}
3763       break;
3764 
3765     default:;
3766     }
3767 
3768   stmt = gsi_stmt (*gsi);
3769 
3770   /* Fold *& on the lhs.  */
3771   if (gimple_has_lhs (stmt))
3772     {
3773       tree lhs = gimple_get_lhs (stmt);
3774       if (lhs && REFERENCE_CLASS_P (lhs))
3775 	{
3776 	  tree new_lhs = maybe_fold_reference (lhs, true);
3777 	  if (new_lhs)
3778 	    {
3779 	      gimple_set_lhs (stmt, new_lhs);
3780 	      changed = true;
3781 	    }
3782 	}
3783     }
3784 
3785   return changed;
3786 }
3787 
3788 /* Valueziation callback that ends up not following SSA edges.  */
3789 
3790 tree
3791 no_follow_ssa_edges (tree)
3792 {
3793   return NULL_TREE;
3794 }
3795 
3796 /* Valueization callback that ends up following single-use SSA edges only.  */
3797 
3798 tree
3799 follow_single_use_edges (tree val)
3800 {
3801   if (TREE_CODE (val) == SSA_NAME
3802       && !has_single_use (val))
3803     return NULL_TREE;
3804   return val;
3805 }
3806 
3807 /* Fold the statement pointed to by GSI.  In some cases, this function may
3808    replace the whole statement with a new one.  Returns true iff folding
3809    makes any changes.
3810    The statement pointed to by GSI should be in valid gimple form but may
3811    be in unfolded state as resulting from for example constant propagation
3812    which can produce *&x = 0.  */
3813 
3814 bool
3815 fold_stmt (gimple_stmt_iterator *gsi)
3816 {
3817   return fold_stmt_1 (gsi, false, no_follow_ssa_edges);
3818 }
3819 
3820 bool
3821 fold_stmt (gimple_stmt_iterator *gsi, tree (*valueize) (tree))
3822 {
3823   return fold_stmt_1 (gsi, false, valueize);
3824 }
3825 
3826 /* Perform the minimal folding on statement *GSI.  Only operations like
3827    *&x created by constant propagation are handled.  The statement cannot
3828    be replaced with a new one.  Return true if the statement was
3829    changed, false otherwise.
3830    The statement *GSI should be in valid gimple form but may
3831    be in unfolded state as resulting from for example constant propagation
3832    which can produce *&x = 0.  */
3833 
3834 bool
3835 fold_stmt_inplace (gimple_stmt_iterator *gsi)
3836 {
3837   gimple stmt = gsi_stmt (*gsi);
3838   bool changed = fold_stmt_1 (gsi, true, no_follow_ssa_edges);
3839   gcc_assert (gsi_stmt (*gsi) == stmt);
3840   return changed;
3841 }
3842 
3843 /* Canonicalize and possibly invert the boolean EXPR; return NULL_TREE
3844    if EXPR is null or we don't know how.
3845    If non-null, the result always has boolean type.  */
3846 
3847 static tree
3848 canonicalize_bool (tree expr, bool invert)
3849 {
3850   if (!expr)
3851     return NULL_TREE;
3852   else if (invert)
3853     {
3854       if (integer_nonzerop (expr))
3855 	return boolean_false_node;
3856       else if (integer_zerop (expr))
3857 	return boolean_true_node;
3858       else if (TREE_CODE (expr) == SSA_NAME)
3859 	return fold_build2 (EQ_EXPR, boolean_type_node, expr,
3860 			    build_int_cst (TREE_TYPE (expr), 0));
3861       else if (TREE_CODE_CLASS (TREE_CODE (expr)) == tcc_comparison)
3862 	return fold_build2 (invert_tree_comparison (TREE_CODE (expr), false),
3863 			    boolean_type_node,
3864 			    TREE_OPERAND (expr, 0),
3865 			    TREE_OPERAND (expr, 1));
3866       else
3867 	return NULL_TREE;
3868     }
3869   else
3870     {
3871       if (TREE_CODE (TREE_TYPE (expr)) == BOOLEAN_TYPE)
3872 	return expr;
3873       if (integer_nonzerop (expr))
3874 	return boolean_true_node;
3875       else if (integer_zerop (expr))
3876 	return boolean_false_node;
3877       else if (TREE_CODE (expr) == SSA_NAME)
3878 	return fold_build2 (NE_EXPR, boolean_type_node, expr,
3879 			    build_int_cst (TREE_TYPE (expr), 0));
3880       else if (TREE_CODE_CLASS (TREE_CODE (expr)) == tcc_comparison)
3881 	return fold_build2 (TREE_CODE (expr),
3882 			    boolean_type_node,
3883 			    TREE_OPERAND (expr, 0),
3884 			    TREE_OPERAND (expr, 1));
3885       else
3886 	return NULL_TREE;
3887     }
3888 }
3889 
3890 /* Check to see if a boolean expression EXPR is logically equivalent to the
3891    comparison (OP1 CODE OP2).  Check for various identities involving
3892    SSA_NAMEs.  */
3893 
3894 static bool
3895 same_bool_comparison_p (const_tree expr, enum tree_code code,
3896 			const_tree op1, const_tree op2)
3897 {
3898   gimple s;
3899 
3900   /* The obvious case.  */
3901   if (TREE_CODE (expr) == code
3902       && operand_equal_p (TREE_OPERAND (expr, 0), op1, 0)
3903       && operand_equal_p (TREE_OPERAND (expr, 1), op2, 0))
3904     return true;
3905 
3906   /* Check for comparing (name, name != 0) and the case where expr
3907      is an SSA_NAME with a definition matching the comparison.  */
3908   if (TREE_CODE (expr) == SSA_NAME
3909       && TREE_CODE (TREE_TYPE (expr)) == BOOLEAN_TYPE)
3910     {
3911       if (operand_equal_p (expr, op1, 0))
3912 	return ((code == NE_EXPR && integer_zerop (op2))
3913 		|| (code == EQ_EXPR && integer_nonzerop (op2)));
3914       s = SSA_NAME_DEF_STMT (expr);
3915       if (is_gimple_assign (s)
3916 	  && gimple_assign_rhs_code (s) == code
3917 	  && operand_equal_p (gimple_assign_rhs1 (s), op1, 0)
3918 	  && operand_equal_p (gimple_assign_rhs2 (s), op2, 0))
3919 	return true;
3920     }
3921 
3922   /* If op1 is of the form (name != 0) or (name == 0), and the definition
3923      of name is a comparison, recurse.  */
3924   if (TREE_CODE (op1) == SSA_NAME
3925       && TREE_CODE (TREE_TYPE (op1)) == BOOLEAN_TYPE)
3926     {
3927       s = SSA_NAME_DEF_STMT (op1);
3928       if (is_gimple_assign (s)
3929 	  && TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison)
3930 	{
3931 	  enum tree_code c = gimple_assign_rhs_code (s);
3932 	  if ((c == NE_EXPR && integer_zerop (op2))
3933 	      || (c == EQ_EXPR && integer_nonzerop (op2)))
3934 	    return same_bool_comparison_p (expr, c,
3935 					   gimple_assign_rhs1 (s),
3936 					   gimple_assign_rhs2 (s));
3937 	  if ((c == EQ_EXPR && integer_zerop (op2))
3938 	      || (c == NE_EXPR && integer_nonzerop (op2)))
3939 	    return same_bool_comparison_p (expr,
3940 					   invert_tree_comparison (c, false),
3941 					   gimple_assign_rhs1 (s),
3942 					   gimple_assign_rhs2 (s));
3943 	}
3944     }
3945   return false;
3946 }
3947 
3948 /* Check to see if two boolean expressions OP1 and OP2 are logically
3949    equivalent.  */
3950 
3951 static bool
3952 same_bool_result_p (const_tree op1, const_tree op2)
3953 {
3954   /* Simple cases first.  */
3955   if (operand_equal_p (op1, op2, 0))
3956     return true;
3957 
3958   /* Check the cases where at least one of the operands is a comparison.
3959      These are a bit smarter than operand_equal_p in that they apply some
3960      identifies on SSA_NAMEs.  */
3961   if (TREE_CODE_CLASS (TREE_CODE (op2)) == tcc_comparison
3962       && same_bool_comparison_p (op1, TREE_CODE (op2),
3963 				 TREE_OPERAND (op2, 0),
3964 				 TREE_OPERAND (op2, 1)))
3965     return true;
3966   if (TREE_CODE_CLASS (TREE_CODE (op1)) == tcc_comparison
3967       && same_bool_comparison_p (op2, TREE_CODE (op1),
3968 				 TREE_OPERAND (op1, 0),
3969 				 TREE_OPERAND (op1, 1)))
3970     return true;
3971 
3972   /* Default case.  */
3973   return false;
3974 }
3975 
3976 /* Forward declarations for some mutually recursive functions.  */
3977 
3978 static tree
3979 and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
3980 		   enum tree_code code2, tree op2a, tree op2b);
3981 static tree
3982 and_var_with_comparison (tree var, bool invert,
3983 			 enum tree_code code2, tree op2a, tree op2b);
3984 static tree
3985 and_var_with_comparison_1 (gimple stmt,
3986 			   enum tree_code code2, tree op2a, tree op2b);
3987 static tree
3988 or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
3989 		  enum tree_code code2, tree op2a, tree op2b);
3990 static tree
3991 or_var_with_comparison (tree var, bool invert,
3992 			enum tree_code code2, tree op2a, tree op2b);
3993 static tree
3994 or_var_with_comparison_1 (gimple stmt,
3995 			  enum tree_code code2, tree op2a, tree op2b);
3996 
3997 /* Helper function for and_comparisons_1:  try to simplify the AND of the
3998    ssa variable VAR with the comparison specified by (OP2A CODE2 OP2B).
3999    If INVERT is true, invert the value of the VAR before doing the AND.
4000    Return NULL_EXPR if we can't simplify this to a single expression.  */
4001 
4002 static tree
4003 and_var_with_comparison (tree var, bool invert,
4004 			 enum tree_code code2, tree op2a, tree op2b)
4005 {
4006   tree t;
4007   gimple stmt = SSA_NAME_DEF_STMT (var);
4008 
4009   /* We can only deal with variables whose definitions are assignments.  */
4010   if (!is_gimple_assign (stmt))
4011     return NULL_TREE;
4012 
4013   /* If we have an inverted comparison, apply DeMorgan's law and rewrite
4014      !var AND (op2a code2 op2b) => !(var OR !(op2a code2 op2b))
4015      Then we only have to consider the simpler non-inverted cases.  */
4016   if (invert)
4017     t = or_var_with_comparison_1 (stmt,
4018 				  invert_tree_comparison (code2, false),
4019 				  op2a, op2b);
4020   else
4021     t = and_var_with_comparison_1 (stmt, code2, op2a, op2b);
4022   return canonicalize_bool (t, invert);
4023 }
4024 
4025 /* Try to simplify the AND of the ssa variable defined by the assignment
4026    STMT with the comparison specified by (OP2A CODE2 OP2B).
4027    Return NULL_EXPR if we can't simplify this to a single expression.  */
4028 
4029 static tree
4030 and_var_with_comparison_1 (gimple stmt,
4031 			   enum tree_code code2, tree op2a, tree op2b)
4032 {
4033   tree var = gimple_assign_lhs (stmt);
4034   tree true_test_var = NULL_TREE;
4035   tree false_test_var = NULL_TREE;
4036   enum tree_code innercode = gimple_assign_rhs_code (stmt);
4037 
4038   /* Check for identities like (var AND (var == 0)) => false.  */
4039   if (TREE_CODE (op2a) == SSA_NAME
4040       && TREE_CODE (TREE_TYPE (var)) == BOOLEAN_TYPE)
4041     {
4042       if ((code2 == NE_EXPR && integer_zerop (op2b))
4043 	  || (code2 == EQ_EXPR && integer_nonzerop (op2b)))
4044 	{
4045 	  true_test_var = op2a;
4046 	  if (var == true_test_var)
4047 	    return var;
4048 	}
4049       else if ((code2 == EQ_EXPR && integer_zerop (op2b))
4050 	       || (code2 == NE_EXPR && integer_nonzerop (op2b)))
4051 	{
4052 	  false_test_var = op2a;
4053 	  if (var == false_test_var)
4054 	    return boolean_false_node;
4055 	}
4056     }
4057 
4058   /* If the definition is a comparison, recurse on it.  */
4059   if (TREE_CODE_CLASS (innercode) == tcc_comparison)
4060     {
4061       tree t = and_comparisons_1 (innercode,
4062 				  gimple_assign_rhs1 (stmt),
4063 				  gimple_assign_rhs2 (stmt),
4064 				  code2,
4065 				  op2a,
4066 				  op2b);
4067       if (t)
4068 	return t;
4069     }
4070 
4071   /* If the definition is an AND or OR expression, we may be able to
4072      simplify by reassociating.  */
4073   if (TREE_CODE (TREE_TYPE (var)) == BOOLEAN_TYPE
4074       && (innercode == BIT_AND_EXPR || innercode == BIT_IOR_EXPR))
4075     {
4076       tree inner1 = gimple_assign_rhs1 (stmt);
4077       tree inner2 = gimple_assign_rhs2 (stmt);
4078       gimple s;
4079       tree t;
4080       tree partial = NULL_TREE;
4081       bool is_and = (innercode == BIT_AND_EXPR);
4082 
4083       /* Check for boolean identities that don't require recursive examination
4084 	 of inner1/inner2:
4085 	 inner1 AND (inner1 AND inner2) => inner1 AND inner2 => var
4086 	 inner1 AND (inner1 OR inner2) => inner1
4087 	 !inner1 AND (inner1 AND inner2) => false
4088 	 !inner1 AND (inner1 OR inner2) => !inner1 AND inner2
4089          Likewise for similar cases involving inner2.  */
4090       if (inner1 == true_test_var)
4091 	return (is_and ? var : inner1);
4092       else if (inner2 == true_test_var)
4093 	return (is_and ? var : inner2);
4094       else if (inner1 == false_test_var)
4095 	return (is_and
4096 		? boolean_false_node
4097 		: and_var_with_comparison (inner2, false, code2, op2a, op2b));
4098       else if (inner2 == false_test_var)
4099 	return (is_and
4100 		? boolean_false_node
4101 		: and_var_with_comparison (inner1, false, code2, op2a, op2b));
4102 
4103       /* Next, redistribute/reassociate the AND across the inner tests.
4104 	 Compute the first partial result, (inner1 AND (op2a code op2b))  */
4105       if (TREE_CODE (inner1) == SSA_NAME
4106 	  && is_gimple_assign (s = SSA_NAME_DEF_STMT (inner1))
4107 	  && TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison
4108 	  && (t = maybe_fold_and_comparisons (gimple_assign_rhs_code (s),
4109 					      gimple_assign_rhs1 (s),
4110 					      gimple_assign_rhs2 (s),
4111 					      code2, op2a, op2b)))
4112 	{
4113 	  /* Handle the AND case, where we are reassociating:
4114 	     (inner1 AND inner2) AND (op2a code2 op2b)
4115 	     => (t AND inner2)
4116 	     If the partial result t is a constant, we win.  Otherwise
4117 	     continue on to try reassociating with the other inner test.  */
4118 	  if (is_and)
4119 	    {
4120 	      if (integer_onep (t))
4121 		return inner2;
4122 	      else if (integer_zerop (t))
4123 		return boolean_false_node;
4124 	    }
4125 
4126 	  /* Handle the OR case, where we are redistributing:
4127 	     (inner1 OR inner2) AND (op2a code2 op2b)
4128 	     => (t OR (inner2 AND (op2a code2 op2b)))  */
4129 	  else if (integer_onep (t))
4130 	    return boolean_true_node;
4131 
4132 	  /* Save partial result for later.  */
4133 	  partial = t;
4134 	}
4135 
4136       /* Compute the second partial result, (inner2 AND (op2a code op2b)) */
4137       if (TREE_CODE (inner2) == SSA_NAME
4138 	  && is_gimple_assign (s = SSA_NAME_DEF_STMT (inner2))
4139 	  && TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison
4140 	  && (t = maybe_fold_and_comparisons (gimple_assign_rhs_code (s),
4141 					      gimple_assign_rhs1 (s),
4142 					      gimple_assign_rhs2 (s),
4143 					      code2, op2a, op2b)))
4144 	{
4145 	  /* Handle the AND case, where we are reassociating:
4146 	     (inner1 AND inner2) AND (op2a code2 op2b)
4147 	     => (inner1 AND t)  */
4148 	  if (is_and)
4149 	    {
4150 	      if (integer_onep (t))
4151 		return inner1;
4152 	      else if (integer_zerop (t))
4153 		return boolean_false_node;
4154 	      /* If both are the same, we can apply the identity
4155 		 (x AND x) == x.  */
4156 	      else if (partial && same_bool_result_p (t, partial))
4157 		return t;
4158 	    }
4159 
4160 	  /* Handle the OR case. where we are redistributing:
4161 	     (inner1 OR inner2) AND (op2a code2 op2b)
4162 	     => (t OR (inner1 AND (op2a code2 op2b)))
4163 	     => (t OR partial)  */
4164 	  else
4165 	    {
4166 	      if (integer_onep (t))
4167 		return boolean_true_node;
4168 	      else if (partial)
4169 		{
4170 		  /* We already got a simplification for the other
4171 		     operand to the redistributed OR expression.  The
4172 		     interesting case is when at least one is false.
4173 		     Or, if both are the same, we can apply the identity
4174 		     (x OR x) == x.  */
4175 		  if (integer_zerop (partial))
4176 		    return t;
4177 		  else if (integer_zerop (t))
4178 		    return partial;
4179 		  else if (same_bool_result_p (t, partial))
4180 		    return t;
4181 		}
4182 	    }
4183 	}
4184     }
4185   return NULL_TREE;
4186 }
4187 
4188 /* Try to simplify the AND of two comparisons defined by
4189    (OP1A CODE1 OP1B) and (OP2A CODE2 OP2B), respectively.
4190    If this can be done without constructing an intermediate value,
4191    return the resulting tree; otherwise NULL_TREE is returned.
4192    This function is deliberately asymmetric as it recurses on SSA_DEFs
4193    in the first comparison but not the second.  */
4194 
4195 static tree
4196 and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
4197 		   enum tree_code code2, tree op2a, tree op2b)
4198 {
4199   tree truth_type = truth_type_for (TREE_TYPE (op1a));
4200 
4201   /* First check for ((x CODE1 y) AND (x CODE2 y)).  */
4202   if (operand_equal_p (op1a, op2a, 0)
4203       && operand_equal_p (op1b, op2b, 0))
4204     {
4205       /* Result will be either NULL_TREE, or a combined comparison.  */
4206       tree t = combine_comparisons (UNKNOWN_LOCATION,
4207 				    TRUTH_ANDIF_EXPR, code1, code2,
4208 				    truth_type, op1a, op1b);
4209       if (t)
4210 	return t;
4211     }
4212 
4213   /* Likewise the swapped case of the above.  */
4214   if (operand_equal_p (op1a, op2b, 0)
4215       && operand_equal_p (op1b, op2a, 0))
4216     {
4217       /* Result will be either NULL_TREE, or a combined comparison.  */
4218       tree t = combine_comparisons (UNKNOWN_LOCATION,
4219 				    TRUTH_ANDIF_EXPR, code1,
4220 				    swap_tree_comparison (code2),
4221 				    truth_type, op1a, op1b);
4222       if (t)
4223 	return t;
4224     }
4225 
4226   /* If both comparisons are of the same value against constants, we might
4227      be able to merge them.  */
4228   if (operand_equal_p (op1a, op2a, 0)
4229       && TREE_CODE (op1b) == INTEGER_CST
4230       && TREE_CODE (op2b) == INTEGER_CST)
4231     {
4232       int cmp = tree_int_cst_compare (op1b, op2b);
4233 
4234       /* If we have (op1a == op1b), we should either be able to
4235 	 return that or FALSE, depending on whether the constant op1b
4236 	 also satisfies the other comparison against op2b.  */
4237       if (code1 == EQ_EXPR)
4238 	{
4239 	  bool done = true;
4240 	  bool val;
4241 	  switch (code2)
4242 	    {
4243 	    case EQ_EXPR: val = (cmp == 0); break;
4244 	    case NE_EXPR: val = (cmp != 0); break;
4245 	    case LT_EXPR: val = (cmp < 0); break;
4246 	    case GT_EXPR: val = (cmp > 0); break;
4247 	    case LE_EXPR: val = (cmp <= 0); break;
4248 	    case GE_EXPR: val = (cmp >= 0); break;
4249 	    default: done = false;
4250 	    }
4251 	  if (done)
4252 	    {
4253 	      if (val)
4254 		return fold_build2 (code1, boolean_type_node, op1a, op1b);
4255 	      else
4256 		return boolean_false_node;
4257 	    }
4258 	}
4259       /* Likewise if the second comparison is an == comparison.  */
4260       else if (code2 == EQ_EXPR)
4261 	{
4262 	  bool done = true;
4263 	  bool val;
4264 	  switch (code1)
4265 	    {
4266 	    case EQ_EXPR: val = (cmp == 0); break;
4267 	    case NE_EXPR: val = (cmp != 0); break;
4268 	    case LT_EXPR: val = (cmp > 0); break;
4269 	    case GT_EXPR: val = (cmp < 0); break;
4270 	    case LE_EXPR: val = (cmp >= 0); break;
4271 	    case GE_EXPR: val = (cmp <= 0); break;
4272 	    default: done = false;
4273 	    }
4274 	  if (done)
4275 	    {
4276 	      if (val)
4277 		return fold_build2 (code2, boolean_type_node, op2a, op2b);
4278 	      else
4279 		return boolean_false_node;
4280 	    }
4281 	}
4282 
4283       /* Same business with inequality tests.  */
4284       else if (code1 == NE_EXPR)
4285 	{
4286 	  bool val;
4287 	  switch (code2)
4288 	    {
4289 	    case EQ_EXPR: val = (cmp != 0); break;
4290 	    case NE_EXPR: val = (cmp == 0); break;
4291 	    case LT_EXPR: val = (cmp >= 0); break;
4292 	    case GT_EXPR: val = (cmp <= 0); break;
4293 	    case LE_EXPR: val = (cmp > 0); break;
4294 	    case GE_EXPR: val = (cmp < 0); break;
4295 	    default:
4296 	      val = false;
4297 	    }
4298 	  if (val)
4299 	    return fold_build2 (code2, boolean_type_node, op2a, op2b);
4300 	}
4301       else if (code2 == NE_EXPR)
4302 	{
4303 	  bool val;
4304 	  switch (code1)
4305 	    {
4306 	    case EQ_EXPR: val = (cmp == 0); break;
4307 	    case NE_EXPR: val = (cmp != 0); break;
4308 	    case LT_EXPR: val = (cmp <= 0); break;
4309 	    case GT_EXPR: val = (cmp >= 0); break;
4310 	    case LE_EXPR: val = (cmp < 0); break;
4311 	    case GE_EXPR: val = (cmp > 0); break;
4312 	    default:
4313 	      val = false;
4314 	    }
4315 	  if (val)
4316 	    return fold_build2 (code1, boolean_type_node, op1a, op1b);
4317 	}
4318 
4319       /* Chose the more restrictive of two < or <= comparisons.  */
4320       else if ((code1 == LT_EXPR || code1 == LE_EXPR)
4321 	       && (code2 == LT_EXPR || code2 == LE_EXPR))
4322 	{
4323 	  if ((cmp < 0) || (cmp == 0 && code1 == LT_EXPR))
4324 	    return fold_build2 (code1, boolean_type_node, op1a, op1b);
4325 	  else
4326 	    return fold_build2 (code2, boolean_type_node, op2a, op2b);
4327 	}
4328 
4329       /* Likewise chose the more restrictive of two > or >= comparisons.  */
4330       else if ((code1 == GT_EXPR || code1 == GE_EXPR)
4331 	       && (code2 == GT_EXPR || code2 == GE_EXPR))
4332 	{
4333 	  if ((cmp > 0) || (cmp == 0 && code1 == GT_EXPR))
4334 	    return fold_build2 (code1, boolean_type_node, op1a, op1b);
4335 	  else
4336 	    return fold_build2 (code2, boolean_type_node, op2a, op2b);
4337 	}
4338 
4339       /* Check for singleton ranges.  */
4340       else if (cmp == 0
4341 	       && ((code1 == LE_EXPR && code2 == GE_EXPR)
4342 		   || (code1 == GE_EXPR && code2 == LE_EXPR)))
4343 	return fold_build2 (EQ_EXPR, boolean_type_node, op1a, op2b);
4344 
4345       /* Check for disjoint ranges. */
4346       else if (cmp <= 0
4347 	       && (code1 == LT_EXPR || code1 == LE_EXPR)
4348 	       && (code2 == GT_EXPR || code2 == GE_EXPR))
4349 	return boolean_false_node;
4350       else if (cmp >= 0
4351 	       && (code1 == GT_EXPR || code1 == GE_EXPR)
4352 	       && (code2 == LT_EXPR || code2 == LE_EXPR))
4353 	return boolean_false_node;
4354     }
4355 
4356   /* Perhaps the first comparison is (NAME != 0) or (NAME == 1) where
4357      NAME's definition is a truth value.  See if there are any simplifications
4358      that can be done against the NAME's definition.  */
4359   if (TREE_CODE (op1a) == SSA_NAME
4360       && (code1 == NE_EXPR || code1 == EQ_EXPR)
4361       && (integer_zerop (op1b) || integer_onep (op1b)))
4362     {
4363       bool invert = ((code1 == EQ_EXPR && integer_zerop (op1b))
4364 		     || (code1 == NE_EXPR && integer_onep (op1b)));
4365       gimple stmt = SSA_NAME_DEF_STMT (op1a);
4366       switch (gimple_code (stmt))
4367 	{
4368 	case GIMPLE_ASSIGN:
4369 	  /* Try to simplify by copy-propagating the definition.  */
4370 	  return and_var_with_comparison (op1a, invert, code2, op2a, op2b);
4371 
4372 	case GIMPLE_PHI:
4373 	  /* If every argument to the PHI produces the same result when
4374 	     ANDed with the second comparison, we win.
4375 	     Do not do this unless the type is bool since we need a bool
4376 	     result here anyway.  */
4377 	  if (TREE_CODE (TREE_TYPE (op1a)) == BOOLEAN_TYPE)
4378 	    {
4379 	      tree result = NULL_TREE;
4380 	      unsigned i;
4381 	      for (i = 0; i < gimple_phi_num_args (stmt); i++)
4382 		{
4383 		  tree arg = gimple_phi_arg_def (stmt, i);
4384 
4385 		  /* If this PHI has itself as an argument, ignore it.
4386 		     If all the other args produce the same result,
4387 		     we're still OK.  */
4388 		  if (arg == gimple_phi_result (stmt))
4389 		    continue;
4390 		  else if (TREE_CODE (arg) == INTEGER_CST)
4391 		    {
4392 		      if (invert ? integer_nonzerop (arg) : integer_zerop (arg))
4393 			{
4394 			  if (!result)
4395 			    result = boolean_false_node;
4396 			  else if (!integer_zerop (result))
4397 			    return NULL_TREE;
4398 			}
4399 		      else if (!result)
4400 			result = fold_build2 (code2, boolean_type_node,
4401 					      op2a, op2b);
4402 		      else if (!same_bool_comparison_p (result,
4403 							code2, op2a, op2b))
4404 			return NULL_TREE;
4405 		    }
4406 		  else if (TREE_CODE (arg) == SSA_NAME
4407 			   && !SSA_NAME_IS_DEFAULT_DEF (arg))
4408 		    {
4409 		      tree temp;
4410 		      gimple def_stmt = SSA_NAME_DEF_STMT (arg);
4411 		      /* In simple cases we can look through PHI nodes,
4412 			 but we have to be careful with loops.
4413 			 See PR49073.  */
4414 		      if (! dom_info_available_p (CDI_DOMINATORS)
4415 			  || gimple_bb (def_stmt) == gimple_bb (stmt)
4416 			  || dominated_by_p (CDI_DOMINATORS,
4417 					     gimple_bb (def_stmt),
4418 					     gimple_bb (stmt)))
4419 			return NULL_TREE;
4420 		      temp = and_var_with_comparison (arg, invert, code2,
4421 						      op2a, op2b);
4422 		      if (!temp)
4423 			return NULL_TREE;
4424 		      else if (!result)
4425 			result = temp;
4426 		      else if (!same_bool_result_p (result, temp))
4427 			return NULL_TREE;
4428 		    }
4429 		  else
4430 		    return NULL_TREE;
4431 		}
4432 	      return result;
4433 	    }
4434 
4435 	default:
4436 	  break;
4437 	}
4438     }
4439   return NULL_TREE;
4440 }
4441 
4442 /* Try to simplify the AND of two comparisons, specified by
4443    (OP1A CODE1 OP1B) and (OP2B CODE2 OP2B), respectively.
4444    If this can be simplified to a single expression (without requiring
4445    introducing more SSA variables to hold intermediate values),
4446    return the resulting tree.  Otherwise return NULL_TREE.
4447    If the result expression is non-null, it has boolean type.  */
4448 
4449 tree
4450 maybe_fold_and_comparisons (enum tree_code code1, tree op1a, tree op1b,
4451 			    enum tree_code code2, tree op2a, tree op2b)
4452 {
4453   tree t = and_comparisons_1 (code1, op1a, op1b, code2, op2a, op2b);
4454   if (t)
4455     return t;
4456   else
4457     return and_comparisons_1 (code2, op2a, op2b, code1, op1a, op1b);
4458 }
4459 
4460 /* Helper function for or_comparisons_1:  try to simplify the OR of the
4461    ssa variable VAR with the comparison specified by (OP2A CODE2 OP2B).
4462    If INVERT is true, invert the value of VAR before doing the OR.
4463    Return NULL_EXPR if we can't simplify this to a single expression.  */
4464 
4465 static tree
4466 or_var_with_comparison (tree var, bool invert,
4467 			enum tree_code code2, tree op2a, tree op2b)
4468 {
4469   tree t;
4470   gimple stmt = SSA_NAME_DEF_STMT (var);
4471 
4472   /* We can only deal with variables whose definitions are assignments.  */
4473   if (!is_gimple_assign (stmt))
4474     return NULL_TREE;
4475 
4476   /* If we have an inverted comparison, apply DeMorgan's law and rewrite
4477      !var OR (op2a code2 op2b) => !(var AND !(op2a code2 op2b))
4478      Then we only have to consider the simpler non-inverted cases.  */
4479   if (invert)
4480     t = and_var_with_comparison_1 (stmt,
4481 				   invert_tree_comparison (code2, false),
4482 				   op2a, op2b);
4483   else
4484     t = or_var_with_comparison_1 (stmt, code2, op2a, op2b);
4485   return canonicalize_bool (t, invert);
4486 }
4487 
4488 /* Try to simplify the OR of the ssa variable defined by the assignment
4489    STMT with the comparison specified by (OP2A CODE2 OP2B).
4490    Return NULL_EXPR if we can't simplify this to a single expression.  */
4491 
4492 static tree
4493 or_var_with_comparison_1 (gimple stmt,
4494 			  enum tree_code code2, tree op2a, tree op2b)
4495 {
4496   tree var = gimple_assign_lhs (stmt);
4497   tree true_test_var = NULL_TREE;
4498   tree false_test_var = NULL_TREE;
4499   enum tree_code innercode = gimple_assign_rhs_code (stmt);
4500 
4501   /* Check for identities like (var OR (var != 0)) => true .  */
4502   if (TREE_CODE (op2a) == SSA_NAME
4503       && TREE_CODE (TREE_TYPE (var)) == BOOLEAN_TYPE)
4504     {
4505       if ((code2 == NE_EXPR && integer_zerop (op2b))
4506 	  || (code2 == EQ_EXPR && integer_nonzerop (op2b)))
4507 	{
4508 	  true_test_var = op2a;
4509 	  if (var == true_test_var)
4510 	    return var;
4511 	}
4512       else if ((code2 == EQ_EXPR && integer_zerop (op2b))
4513 	       || (code2 == NE_EXPR && integer_nonzerop (op2b)))
4514 	{
4515 	  false_test_var = op2a;
4516 	  if (var == false_test_var)
4517 	    return boolean_true_node;
4518 	}
4519     }
4520 
4521   /* If the definition is a comparison, recurse on it.  */
4522   if (TREE_CODE_CLASS (innercode) == tcc_comparison)
4523     {
4524       tree t = or_comparisons_1 (innercode,
4525 				 gimple_assign_rhs1 (stmt),
4526 				 gimple_assign_rhs2 (stmt),
4527 				 code2,
4528 				 op2a,
4529 				 op2b);
4530       if (t)
4531 	return t;
4532     }
4533 
4534   /* If the definition is an AND or OR expression, we may be able to
4535      simplify by reassociating.  */
4536   if (TREE_CODE (TREE_TYPE (var)) == BOOLEAN_TYPE
4537       && (innercode == BIT_AND_EXPR || innercode == BIT_IOR_EXPR))
4538     {
4539       tree inner1 = gimple_assign_rhs1 (stmt);
4540       tree inner2 = gimple_assign_rhs2 (stmt);
4541       gimple s;
4542       tree t;
4543       tree partial = NULL_TREE;
4544       bool is_or = (innercode == BIT_IOR_EXPR);
4545 
4546       /* Check for boolean identities that don't require recursive examination
4547 	 of inner1/inner2:
4548 	 inner1 OR (inner1 OR inner2) => inner1 OR inner2 => var
4549 	 inner1 OR (inner1 AND inner2) => inner1
4550 	 !inner1 OR (inner1 OR inner2) => true
4551 	 !inner1 OR (inner1 AND inner2) => !inner1 OR inner2
4552       */
4553       if (inner1 == true_test_var)
4554 	return (is_or ? var : inner1);
4555       else if (inner2 == true_test_var)
4556 	return (is_or ? var : inner2);
4557       else if (inner1 == false_test_var)
4558 	return (is_or
4559 		? boolean_true_node
4560 		: or_var_with_comparison (inner2, false, code2, op2a, op2b));
4561       else if (inner2 == false_test_var)
4562 	return (is_or
4563 		? boolean_true_node
4564 		: or_var_with_comparison (inner1, false, code2, op2a, op2b));
4565 
4566       /* Next, redistribute/reassociate the OR across the inner tests.
4567 	 Compute the first partial result, (inner1 OR (op2a code op2b))  */
4568       if (TREE_CODE (inner1) == SSA_NAME
4569 	  && is_gimple_assign (s = SSA_NAME_DEF_STMT (inner1))
4570 	  && TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison
4571 	  && (t = maybe_fold_or_comparisons (gimple_assign_rhs_code (s),
4572 					     gimple_assign_rhs1 (s),
4573 					     gimple_assign_rhs2 (s),
4574 					     code2, op2a, op2b)))
4575 	{
4576 	  /* Handle the OR case, where we are reassociating:
4577 	     (inner1 OR inner2) OR (op2a code2 op2b)
4578 	     => (t OR inner2)
4579 	     If the partial result t is a constant, we win.  Otherwise
4580 	     continue on to try reassociating with the other inner test.  */
4581 	  if (is_or)
4582 	    {
4583 	      if (integer_onep (t))
4584 		return boolean_true_node;
4585 	      else if (integer_zerop (t))
4586 		return inner2;
4587 	    }
4588 
4589 	  /* Handle the AND case, where we are redistributing:
4590 	     (inner1 AND inner2) OR (op2a code2 op2b)
4591 	     => (t AND (inner2 OR (op2a code op2b)))  */
4592 	  else if (integer_zerop (t))
4593 	    return boolean_false_node;
4594 
4595 	  /* Save partial result for later.  */
4596 	  partial = t;
4597 	}
4598 
4599       /* Compute the second partial result, (inner2 OR (op2a code op2b)) */
4600       if (TREE_CODE (inner2) == SSA_NAME
4601 	  && is_gimple_assign (s = SSA_NAME_DEF_STMT (inner2))
4602 	  && TREE_CODE_CLASS (gimple_assign_rhs_code (s)) == tcc_comparison
4603 	  && (t = maybe_fold_or_comparisons (gimple_assign_rhs_code (s),
4604 					     gimple_assign_rhs1 (s),
4605 					     gimple_assign_rhs2 (s),
4606 					     code2, op2a, op2b)))
4607 	{
4608 	  /* Handle the OR case, where we are reassociating:
4609 	     (inner1 OR inner2) OR (op2a code2 op2b)
4610 	     => (inner1 OR t)
4611 	     => (t OR partial)  */
4612 	  if (is_or)
4613 	    {
4614 	      if (integer_zerop (t))
4615 		return inner1;
4616 	      else if (integer_onep (t))
4617 		return boolean_true_node;
4618 	      /* If both are the same, we can apply the identity
4619 		 (x OR x) == x.  */
4620 	      else if (partial && same_bool_result_p (t, partial))
4621 		return t;
4622 	    }
4623 
4624 	  /* Handle the AND case, where we are redistributing:
4625 	     (inner1 AND inner2) OR (op2a code2 op2b)
4626 	     => (t AND (inner1 OR (op2a code2 op2b)))
4627 	     => (t AND partial)  */
4628 	  else
4629 	    {
4630 	      if (integer_zerop (t))
4631 		return boolean_false_node;
4632 	      else if (partial)
4633 		{
4634 		  /* We already got a simplification for the other
4635 		     operand to the redistributed AND expression.  The
4636 		     interesting case is when at least one is true.
4637 		     Or, if both are the same, we can apply the identity
4638 		     (x AND x) == x.  */
4639 		  if (integer_onep (partial))
4640 		    return t;
4641 		  else if (integer_onep (t))
4642 		    return partial;
4643 		  else if (same_bool_result_p (t, partial))
4644 		    return t;
4645 		}
4646 	    }
4647 	}
4648     }
4649   return NULL_TREE;
4650 }
4651 
4652 /* Try to simplify the OR of two comparisons defined by
4653    (OP1A CODE1 OP1B) and (OP2A CODE2 OP2B), respectively.
4654    If this can be done without constructing an intermediate value,
4655    return the resulting tree; otherwise NULL_TREE is returned.
4656    This function is deliberately asymmetric as it recurses on SSA_DEFs
4657    in the first comparison but not the second.  */
4658 
4659 static tree
4660 or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
4661 		  enum tree_code code2, tree op2a, tree op2b)
4662 {
4663   tree truth_type = truth_type_for (TREE_TYPE (op1a));
4664 
4665   /* First check for ((x CODE1 y) OR (x CODE2 y)).  */
4666   if (operand_equal_p (op1a, op2a, 0)
4667       && operand_equal_p (op1b, op2b, 0))
4668     {
4669       /* Result will be either NULL_TREE, or a combined comparison.  */
4670       tree t = combine_comparisons (UNKNOWN_LOCATION,
4671 				    TRUTH_ORIF_EXPR, code1, code2,
4672 				    truth_type, op1a, op1b);
4673       if (t)
4674 	return t;
4675     }
4676 
4677   /* Likewise the swapped case of the above.  */
4678   if (operand_equal_p (op1a, op2b, 0)
4679       && operand_equal_p (op1b, op2a, 0))
4680     {
4681       /* Result will be either NULL_TREE, or a combined comparison.  */
4682       tree t = combine_comparisons (UNKNOWN_LOCATION,
4683 				    TRUTH_ORIF_EXPR, code1,
4684 				    swap_tree_comparison (code2),
4685 				    truth_type, op1a, op1b);
4686       if (t)
4687 	return t;
4688     }
4689 
4690   /* If both comparisons are of the same value against constants, we might
4691      be able to merge them.  */
4692   if (operand_equal_p (op1a, op2a, 0)
4693       && TREE_CODE (op1b) == INTEGER_CST
4694       && TREE_CODE (op2b) == INTEGER_CST)
4695     {
4696       int cmp = tree_int_cst_compare (op1b, op2b);
4697 
4698       /* If we have (op1a != op1b), we should either be able to
4699 	 return that or TRUE, depending on whether the constant op1b
4700 	 also satisfies the other comparison against op2b.  */
4701       if (code1 == NE_EXPR)
4702 	{
4703 	  bool done = true;
4704 	  bool val;
4705 	  switch (code2)
4706 	    {
4707 	    case EQ_EXPR: val = (cmp == 0); break;
4708 	    case NE_EXPR: val = (cmp != 0); break;
4709 	    case LT_EXPR: val = (cmp < 0); break;
4710 	    case GT_EXPR: val = (cmp > 0); break;
4711 	    case LE_EXPR: val = (cmp <= 0); break;
4712 	    case GE_EXPR: val = (cmp >= 0); break;
4713 	    default: done = false;
4714 	    }
4715 	  if (done)
4716 	    {
4717 	      if (val)
4718 		return boolean_true_node;
4719 	      else
4720 		return fold_build2 (code1, boolean_type_node, op1a, op1b);
4721 	    }
4722 	}
4723       /* Likewise if the second comparison is a != comparison.  */
4724       else if (code2 == NE_EXPR)
4725 	{
4726 	  bool done = true;
4727 	  bool val;
4728 	  switch (code1)
4729 	    {
4730 	    case EQ_EXPR: val = (cmp == 0); break;
4731 	    case NE_EXPR: val = (cmp != 0); break;
4732 	    case LT_EXPR: val = (cmp > 0); break;
4733 	    case GT_EXPR: val = (cmp < 0); break;
4734 	    case LE_EXPR: val = (cmp >= 0); break;
4735 	    case GE_EXPR: val = (cmp <= 0); break;
4736 	    default: done = false;
4737 	    }
4738 	  if (done)
4739 	    {
4740 	      if (val)
4741 		return boolean_true_node;
4742 	      else
4743 		return fold_build2 (code2, boolean_type_node, op2a, op2b);
4744 	    }
4745 	}
4746 
4747       /* See if an equality test is redundant with the other comparison.  */
4748       else if (code1 == EQ_EXPR)
4749 	{
4750 	  bool val;
4751 	  switch (code2)
4752 	    {
4753 	    case EQ_EXPR: val = (cmp == 0); break;
4754 	    case NE_EXPR: val = (cmp != 0); break;
4755 	    case LT_EXPR: val = (cmp < 0); break;
4756 	    case GT_EXPR: val = (cmp > 0); break;
4757 	    case LE_EXPR: val = (cmp <= 0); break;
4758 	    case GE_EXPR: val = (cmp >= 0); break;
4759 	    default:
4760 	      val = false;
4761 	    }
4762 	  if (val)
4763 	    return fold_build2 (code2, boolean_type_node, op2a, op2b);
4764 	}
4765       else if (code2 == EQ_EXPR)
4766 	{
4767 	  bool val;
4768 	  switch (code1)
4769 	    {
4770 	    case EQ_EXPR: val = (cmp == 0); break;
4771 	    case NE_EXPR: val = (cmp != 0); break;
4772 	    case LT_EXPR: val = (cmp > 0); break;
4773 	    case GT_EXPR: val = (cmp < 0); break;
4774 	    case LE_EXPR: val = (cmp >= 0); break;
4775 	    case GE_EXPR: val = (cmp <= 0); break;
4776 	    default:
4777 	      val = false;
4778 	    }
4779 	  if (val)
4780 	    return fold_build2 (code1, boolean_type_node, op1a, op1b);
4781 	}
4782 
4783       /* Chose the less restrictive of two < or <= comparisons.  */
4784       else if ((code1 == LT_EXPR || code1 == LE_EXPR)
4785 	       && (code2 == LT_EXPR || code2 == LE_EXPR))
4786 	{
4787 	  if ((cmp < 0) || (cmp == 0 && code1 == LT_EXPR))
4788 	    return fold_build2 (code2, boolean_type_node, op2a, op2b);
4789 	  else
4790 	    return fold_build2 (code1, boolean_type_node, op1a, op1b);
4791 	}
4792 
4793       /* Likewise chose the less restrictive of two > or >= comparisons.  */
4794       else if ((code1 == GT_EXPR || code1 == GE_EXPR)
4795 	       && (code2 == GT_EXPR || code2 == GE_EXPR))
4796 	{
4797 	  if ((cmp > 0) || (cmp == 0 && code1 == GT_EXPR))
4798 	    return fold_build2 (code2, boolean_type_node, op2a, op2b);
4799 	  else
4800 	    return fold_build2 (code1, boolean_type_node, op1a, op1b);
4801 	}
4802 
4803       /* Check for singleton ranges.  */
4804       else if (cmp == 0
4805 	       && ((code1 == LT_EXPR && code2 == GT_EXPR)
4806 		   || (code1 == GT_EXPR && code2 == LT_EXPR)))
4807 	return fold_build2 (NE_EXPR, boolean_type_node, op1a, op2b);
4808 
4809       /* Check for less/greater pairs that don't restrict the range at all.  */
4810       else if (cmp >= 0
4811 	       && (code1 == LT_EXPR || code1 == LE_EXPR)
4812 	       && (code2 == GT_EXPR || code2 == GE_EXPR))
4813 	return boolean_true_node;
4814       else if (cmp <= 0
4815 	       && (code1 == GT_EXPR || code1 == GE_EXPR)
4816 	       && (code2 == LT_EXPR || code2 == LE_EXPR))
4817 	return boolean_true_node;
4818     }
4819 
4820   /* Perhaps the first comparison is (NAME != 0) or (NAME == 1) where
4821      NAME's definition is a truth value.  See if there are any simplifications
4822      that can be done against the NAME's definition.  */
4823   if (TREE_CODE (op1a) == SSA_NAME
4824       && (code1 == NE_EXPR || code1 == EQ_EXPR)
4825       && (integer_zerop (op1b) || integer_onep (op1b)))
4826     {
4827       bool invert = ((code1 == EQ_EXPR && integer_zerop (op1b))
4828 		     || (code1 == NE_EXPR && integer_onep (op1b)));
4829       gimple stmt = SSA_NAME_DEF_STMT (op1a);
4830       switch (gimple_code (stmt))
4831 	{
4832 	case GIMPLE_ASSIGN:
4833 	  /* Try to simplify by copy-propagating the definition.  */
4834 	  return or_var_with_comparison (op1a, invert, code2, op2a, op2b);
4835 
4836 	case GIMPLE_PHI:
4837 	  /* If every argument to the PHI produces the same result when
4838 	     ORed with the second comparison, we win.
4839 	     Do not do this unless the type is bool since we need a bool
4840 	     result here anyway.  */
4841 	  if (TREE_CODE (TREE_TYPE (op1a)) == BOOLEAN_TYPE)
4842 	    {
4843 	      tree result = NULL_TREE;
4844 	      unsigned i;
4845 	      for (i = 0; i < gimple_phi_num_args (stmt); i++)
4846 		{
4847 		  tree arg = gimple_phi_arg_def (stmt, i);
4848 
4849 		  /* If this PHI has itself as an argument, ignore it.
4850 		     If all the other args produce the same result,
4851 		     we're still OK.  */
4852 		  if (arg == gimple_phi_result (stmt))
4853 		    continue;
4854 		  else if (TREE_CODE (arg) == INTEGER_CST)
4855 		    {
4856 		      if (invert ? integer_zerop (arg) : integer_nonzerop (arg))
4857 			{
4858 			  if (!result)
4859 			    result = boolean_true_node;
4860 			  else if (!integer_onep (result))
4861 			    return NULL_TREE;
4862 			}
4863 		      else if (!result)
4864 			result = fold_build2 (code2, boolean_type_node,
4865 					      op2a, op2b);
4866 		      else if (!same_bool_comparison_p (result,
4867 							code2, op2a, op2b))
4868 			return NULL_TREE;
4869 		    }
4870 		  else if (TREE_CODE (arg) == SSA_NAME
4871 			   && !SSA_NAME_IS_DEFAULT_DEF (arg))
4872 		    {
4873 		      tree temp;
4874 		      gimple def_stmt = SSA_NAME_DEF_STMT (arg);
4875 		      /* In simple cases we can look through PHI nodes,
4876 			 but we have to be careful with loops.
4877 			 See PR49073.  */
4878 		      if (! dom_info_available_p (CDI_DOMINATORS)
4879 			  || gimple_bb (def_stmt) == gimple_bb (stmt)
4880 			  || dominated_by_p (CDI_DOMINATORS,
4881 					     gimple_bb (def_stmt),
4882 					     gimple_bb (stmt)))
4883 			return NULL_TREE;
4884 		      temp = or_var_with_comparison (arg, invert, code2,
4885 						     op2a, op2b);
4886 		      if (!temp)
4887 			return NULL_TREE;
4888 		      else if (!result)
4889 			result = temp;
4890 		      else if (!same_bool_result_p (result, temp))
4891 			return NULL_TREE;
4892 		    }
4893 		  else
4894 		    return NULL_TREE;
4895 		}
4896 	      return result;
4897 	    }
4898 
4899 	default:
4900 	  break;
4901 	}
4902     }
4903   return NULL_TREE;
4904 }
4905 
4906 /* Try to simplify the OR of two comparisons, specified by
4907    (OP1A CODE1 OP1B) and (OP2B CODE2 OP2B), respectively.
4908    If this can be simplified to a single expression (without requiring
4909    introducing more SSA variables to hold intermediate values),
4910    return the resulting tree.  Otherwise return NULL_TREE.
4911    If the result expression is non-null, it has boolean type.  */
4912 
4913 tree
4914 maybe_fold_or_comparisons (enum tree_code code1, tree op1a, tree op1b,
4915 			   enum tree_code code2, tree op2a, tree op2b)
4916 {
4917   tree t = or_comparisons_1 (code1, op1a, op1b, code2, op2a, op2b);
4918   if (t)
4919     return t;
4920   else
4921     return or_comparisons_1 (code2, op2a, op2b, code1, op1a, op1b);
4922 }
4923 
4924 
4925 /* Fold STMT to a constant using VALUEIZE to valueize SSA names.
4926 
4927    Either NULL_TREE, a simplified but non-constant or a constant
4928    is returned.
4929 
4930    ???  This should go into a gimple-fold-inline.h file to be eventually
4931    privatized with the single valueize function used in the various TUs
4932    to avoid the indirect function call overhead.  */
4933 
4934 tree
4935 gimple_fold_stmt_to_constant_1 (gimple stmt, tree (*valueize) (tree),
4936 				tree (*gvalueize) (tree))
4937 {
4938   code_helper rcode;
4939   tree ops[3] = {};
4940   /* ???  The SSA propagators do not correctly deal with following SSA use-def
4941      edges if there are intermediate VARYING defs.  For this reason
4942      do not follow SSA edges here even though SCCVN can technically
4943      just deal fine with that.  */
4944   if (gimple_simplify (stmt, &rcode, ops, NULL, gvalueize)
4945       && rcode.is_tree_code ()
4946       && (TREE_CODE_LENGTH ((tree_code) rcode) == 0
4947 	  || ((tree_code) rcode) == ADDR_EXPR)
4948       && is_gimple_val (ops[0]))
4949     {
4950       tree res = ops[0];
4951       if (dump_file && dump_flags & TDF_DETAILS)
4952 	{
4953 	  fprintf (dump_file, "Match-and-simplified ");
4954 	  print_gimple_expr (dump_file, stmt, 0, TDF_SLIM);
4955 	  fprintf (dump_file, " to ");
4956 	  print_generic_expr (dump_file, res, 0);
4957 	  fprintf (dump_file, "\n");
4958 	}
4959       return res;
4960     }
4961 
4962   location_t loc = gimple_location (stmt);
4963   switch (gimple_code (stmt))
4964     {
4965     case GIMPLE_ASSIGN:
4966       {
4967         enum tree_code subcode = gimple_assign_rhs_code (stmt);
4968 
4969         switch (get_gimple_rhs_class (subcode))
4970           {
4971           case GIMPLE_SINGLE_RHS:
4972             {
4973               tree rhs = gimple_assign_rhs1 (stmt);
4974               enum tree_code_class kind = TREE_CODE_CLASS (subcode);
4975 
4976               if (TREE_CODE (rhs) == SSA_NAME)
4977                 {
4978                   /* If the RHS is an SSA_NAME, return its known constant value,
4979                      if any.  */
4980                   return (*valueize) (rhs);
4981                 }
4982 	      /* Handle propagating invariant addresses into address
4983 		 operations.  */
4984 	      else if (TREE_CODE (rhs) == ADDR_EXPR
4985 		       && !is_gimple_min_invariant (rhs))
4986 		{
4987 		  HOST_WIDE_INT offset = 0;
4988 		  tree base;
4989 		  base = get_addr_base_and_unit_offset_1 (TREE_OPERAND (rhs, 0),
4990 							  &offset,
4991 							  valueize);
4992 		  if (base
4993 		      && (CONSTANT_CLASS_P (base)
4994 			  || decl_address_invariant_p (base)))
4995 		    return build_invariant_address (TREE_TYPE (rhs),
4996 						    base, offset);
4997 		}
4998 	      else if (TREE_CODE (rhs) == CONSTRUCTOR
4999 		       && TREE_CODE (TREE_TYPE (rhs)) == VECTOR_TYPE
5000 		       && (CONSTRUCTOR_NELTS (rhs)
5001 			   == TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs))))
5002 		{
5003 		  unsigned i;
5004 		  tree val, *vec;
5005 
5006 		  vec = XALLOCAVEC (tree,
5007 				    TYPE_VECTOR_SUBPARTS (TREE_TYPE (rhs)));
5008 		  FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (rhs), i, val)
5009 		    {
5010 		      val = (*valueize) (val);
5011 		      if (TREE_CODE (val) == INTEGER_CST
5012 			  || TREE_CODE (val) == REAL_CST
5013 			  || TREE_CODE (val) == FIXED_CST)
5014 			vec[i] = val;
5015 		      else
5016 			return NULL_TREE;
5017 		    }
5018 
5019 		  return build_vector (TREE_TYPE (rhs), vec);
5020 		}
5021 	      if (subcode == OBJ_TYPE_REF)
5022 		{
5023 		  tree val = (*valueize) (OBJ_TYPE_REF_EXPR (rhs));
5024 		  /* If callee is constant, we can fold away the wrapper.  */
5025 		  if (is_gimple_min_invariant (val))
5026 		    return val;
5027 		}
5028 
5029               if (kind == tcc_reference)
5030 		{
5031 		  if ((TREE_CODE (rhs) == VIEW_CONVERT_EXPR
5032 		       || TREE_CODE (rhs) == REALPART_EXPR
5033 		       || TREE_CODE (rhs) == IMAGPART_EXPR)
5034 		      && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
5035 		    {
5036 		      tree val = (*valueize) (TREE_OPERAND (rhs, 0));
5037 		      return fold_unary_loc (EXPR_LOCATION (rhs),
5038 					     TREE_CODE (rhs),
5039 					     TREE_TYPE (rhs), val);
5040 		    }
5041 		  else if (TREE_CODE (rhs) == BIT_FIELD_REF
5042 			   && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
5043 		    {
5044 		      tree val = (*valueize) (TREE_OPERAND (rhs, 0));
5045 		      return fold_ternary_loc (EXPR_LOCATION (rhs),
5046 					       TREE_CODE (rhs),
5047 					       TREE_TYPE (rhs), val,
5048 					       TREE_OPERAND (rhs, 1),
5049 					       TREE_OPERAND (rhs, 2));
5050 		    }
5051 		  else if (TREE_CODE (rhs) == MEM_REF
5052 			   && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
5053 		    {
5054 		      tree val = (*valueize) (TREE_OPERAND (rhs, 0));
5055 		      if (TREE_CODE (val) == ADDR_EXPR
5056 			  && is_gimple_min_invariant (val))
5057 			{
5058 			  tree tem = fold_build2 (MEM_REF, TREE_TYPE (rhs),
5059 						  unshare_expr (val),
5060 						  TREE_OPERAND (rhs, 1));
5061 			  if (tem)
5062 			    rhs = tem;
5063 			}
5064 		    }
5065 		  return fold_const_aggregate_ref_1 (rhs, valueize);
5066 		}
5067               else if (kind == tcc_declaration)
5068                 return get_symbol_constant_value (rhs);
5069               return rhs;
5070             }
5071 
5072           case GIMPLE_UNARY_RHS:
5073 	    return NULL_TREE;
5074 
5075           case GIMPLE_BINARY_RHS:
5076             {
5077               /* Handle binary operators that can appear in GIMPLE form.  */
5078               tree op0 = (*valueize) (gimple_assign_rhs1 (stmt));
5079               tree op1 = (*valueize) (gimple_assign_rhs2 (stmt));
5080 
5081 	      /* Translate &x + CST into an invariant form suitable for
5082 	         further propagation.  */
5083 	      if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
5084 		  && TREE_CODE (op0) == ADDR_EXPR
5085 		  && TREE_CODE (op1) == INTEGER_CST)
5086 		{
5087 		  tree off = fold_convert (ptr_type_node, op1);
5088 		  return build_fold_addr_expr_loc
5089 			   (loc,
5090 			    fold_build2 (MEM_REF,
5091 					 TREE_TYPE (TREE_TYPE (op0)),
5092 					 unshare_expr (op0), off));
5093 		}
5094 
5095               return fold_binary_loc (loc, subcode,
5096 				      gimple_expr_type (stmt), op0, op1);
5097             }
5098 
5099           case GIMPLE_TERNARY_RHS:
5100             {
5101               /* Handle ternary operators that can appear in GIMPLE form.  */
5102               tree op0 = (*valueize) (gimple_assign_rhs1 (stmt));
5103               tree op1 = (*valueize) (gimple_assign_rhs2 (stmt));
5104               tree op2 = (*valueize) (gimple_assign_rhs3 (stmt));
5105 
5106 	      /* Fold embedded expressions in ternary codes.  */
5107 	      if ((subcode == COND_EXPR
5108 		   || subcode == VEC_COND_EXPR)
5109 		  && COMPARISON_CLASS_P (op0))
5110 		{
5111 		  tree op00 = (*valueize) (TREE_OPERAND (op0, 0));
5112 		  tree op01 = (*valueize) (TREE_OPERAND (op0, 1));
5113 		  tree tem = fold_binary_loc (loc, TREE_CODE (op0),
5114 					      TREE_TYPE (op0), op00, op01);
5115 		  if (tem)
5116 		    op0 = tem;
5117 		}
5118 
5119               return fold_ternary_loc (loc, subcode,
5120 				       gimple_expr_type (stmt), op0, op1, op2);
5121             }
5122 
5123           default:
5124             gcc_unreachable ();
5125           }
5126       }
5127 
5128     case GIMPLE_CALL:
5129       {
5130 	tree fn;
5131 	gcall *call_stmt = as_a <gcall *> (stmt);
5132 
5133 	if (gimple_call_internal_p (stmt))
5134 	  {
5135 	    enum tree_code subcode = ERROR_MARK;
5136 	    switch (gimple_call_internal_fn (stmt))
5137 	      {
5138 	      case IFN_UBSAN_CHECK_ADD:
5139 		subcode = PLUS_EXPR;
5140 		break;
5141 	      case IFN_UBSAN_CHECK_SUB:
5142 		subcode = MINUS_EXPR;
5143 		break;
5144 	      case IFN_UBSAN_CHECK_MUL:
5145 		subcode = MULT_EXPR;
5146 		break;
5147 	      default:
5148 		return NULL_TREE;
5149 	      }
5150 	    tree arg0 = gimple_call_arg (stmt, 0);
5151 	    tree arg1 = gimple_call_arg (stmt, 1);
5152 	    tree op0 = (*valueize) (arg0);
5153 	    tree op1 = (*valueize) (arg1);
5154 
5155 	    if (TREE_CODE (op0) != INTEGER_CST
5156 		|| TREE_CODE (op1) != INTEGER_CST)
5157 	      {
5158 		switch (subcode)
5159 		  {
5160 		  case MULT_EXPR:
5161 		    /* x * 0 = 0 * x = 0 without overflow.  */
5162 		    if (integer_zerop (op0) || integer_zerop (op1))
5163 		      return build_zero_cst (TREE_TYPE (arg0));
5164 		    break;
5165 		  case MINUS_EXPR:
5166 		    /* y - y = 0 without overflow.  */
5167 		    if (operand_equal_p (op0, op1, 0))
5168 		      return build_zero_cst (TREE_TYPE (arg0));
5169 		    break;
5170 		  default:
5171 		    break;
5172 		  }
5173 	      }
5174 	    tree res
5175 	      = fold_binary_loc (loc, subcode, TREE_TYPE (arg0), op0, op1);
5176 	    if (res
5177 		&& TREE_CODE (res) == INTEGER_CST
5178 		&& !TREE_OVERFLOW (res))
5179 	      return res;
5180 	    return NULL_TREE;
5181 	  }
5182 
5183 	fn = (*valueize) (gimple_call_fn (stmt));
5184 	if (TREE_CODE (fn) == ADDR_EXPR
5185 	    && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL
5186 	    && DECL_BUILT_IN (TREE_OPERAND (fn, 0))
5187 	    && gimple_builtin_call_types_compatible_p (stmt,
5188 						       TREE_OPERAND (fn, 0)))
5189 	  {
5190 	    tree *args = XALLOCAVEC (tree, gimple_call_num_args (stmt));
5191 	    tree retval;
5192 	    unsigned i;
5193 	    for (i = 0; i < gimple_call_num_args (stmt); ++i)
5194 	      args[i] = (*valueize) (gimple_call_arg (stmt, i));
5195 	    retval = fold_builtin_call_array (loc,
5196 					 gimple_call_return_type (call_stmt),
5197 					 fn, gimple_call_num_args (stmt), args);
5198 	    if (retval)
5199 	      {
5200 		/* fold_call_expr wraps the result inside a NOP_EXPR.  */
5201 		STRIP_NOPS (retval);
5202 		retval = fold_convert (gimple_call_return_type (call_stmt),
5203 				       retval);
5204 	      }
5205 	    return retval;
5206 	  }
5207 	return NULL_TREE;
5208       }
5209 
5210     default:
5211       return NULL_TREE;
5212     }
5213 }
5214 
5215 /* Fold STMT to a constant using VALUEIZE to valueize SSA names.
5216    Returns NULL_TREE if folding to a constant is not possible, otherwise
5217    returns a constant according to is_gimple_min_invariant.  */
5218 
5219 tree
5220 gimple_fold_stmt_to_constant (gimple stmt, tree (*valueize) (tree))
5221 {
5222   tree res = gimple_fold_stmt_to_constant_1 (stmt, valueize);
5223   if (res && is_gimple_min_invariant (res))
5224     return res;
5225   return NULL_TREE;
5226 }
5227 
5228 
5229 /* The following set of functions are supposed to fold references using
5230    their constant initializers.  */
5231 
5232 /* See if we can find constructor defining value of BASE.
5233    When we know the consructor with constant offset (such as
5234    base is array[40] and we do know constructor of array), then
5235    BIT_OFFSET is adjusted accordingly.
5236 
5237    As a special case, return error_mark_node when constructor
5238    is not explicitly available, but it is known to be zero
5239    such as 'static const int a;'.  */
5240 static tree
5241 get_base_constructor (tree base, HOST_WIDE_INT *bit_offset,
5242 		      tree (*valueize)(tree))
5243 {
5244   HOST_WIDE_INT bit_offset2, size, max_size;
5245   if (TREE_CODE (base) == MEM_REF)
5246     {
5247       if (!integer_zerop (TREE_OPERAND (base, 1)))
5248 	{
5249 	  if (!tree_fits_shwi_p (TREE_OPERAND (base, 1)))
5250 	    return NULL_TREE;
5251 	  *bit_offset += (mem_ref_offset (base).to_short_addr ()
5252 			  * BITS_PER_UNIT);
5253 	}
5254 
5255       if (valueize
5256 	  && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
5257 	base = valueize (TREE_OPERAND (base, 0));
5258       if (!base || TREE_CODE (base) != ADDR_EXPR)
5259         return NULL_TREE;
5260       base = TREE_OPERAND (base, 0);
5261     }
5262 
5263   /* Get a CONSTRUCTOR.  If BASE is a VAR_DECL, get its
5264      DECL_INITIAL.  If BASE is a nested reference into another
5265      ARRAY_REF or COMPONENT_REF, make a recursive call to resolve
5266      the inner reference.  */
5267   switch (TREE_CODE (base))
5268     {
5269     case VAR_DECL:
5270     case CONST_DECL:
5271       {
5272 	tree init = ctor_for_folding (base);
5273 
5274 	/* Our semantic is exact opposite of ctor_for_folding;
5275 	   NULL means unknown, while error_mark_node is 0.  */
5276 	if (init == error_mark_node)
5277 	  return NULL_TREE;
5278 	if (!init)
5279 	  return error_mark_node;
5280 	return init;
5281       }
5282 
5283     case ARRAY_REF:
5284     case COMPONENT_REF:
5285       base = get_ref_base_and_extent (base, &bit_offset2, &size, &max_size);
5286       if (max_size == -1 || size != max_size)
5287 	return NULL_TREE;
5288       *bit_offset +=  bit_offset2;
5289       return get_base_constructor (base, bit_offset, valueize);
5290 
5291     case STRING_CST:
5292     case CONSTRUCTOR:
5293       return base;
5294 
5295     default:
5296       return NULL_TREE;
5297     }
5298 }
5299 
5300 /* CTOR is CONSTRUCTOR of an array type.  Fold reference of type TYPE and size
5301    SIZE to the memory at bit OFFSET.  */
5302 
5303 static tree
5304 fold_array_ctor_reference (tree type, tree ctor,
5305 			   unsigned HOST_WIDE_INT offset,
5306 			   unsigned HOST_WIDE_INT size,
5307 			   tree from_decl)
5308 {
5309   unsigned HOST_WIDE_INT cnt;
5310   tree cfield, cval;
5311   offset_int low_bound;
5312   offset_int elt_size;
5313   offset_int index, max_index;
5314   offset_int access_index;
5315   tree domain_type = NULL_TREE, index_type = NULL_TREE;
5316   HOST_WIDE_INT inner_offset;
5317 
5318   /* Compute low bound and elt size.  */
5319   if (TREE_CODE (TREE_TYPE (ctor)) == ARRAY_TYPE)
5320     domain_type = TYPE_DOMAIN (TREE_TYPE (ctor));
5321   if (domain_type && TYPE_MIN_VALUE (domain_type))
5322     {
5323       /* Static constructors for variably sized objects makes no sense.  */
5324       gcc_assert (TREE_CODE (TYPE_MIN_VALUE (domain_type)) == INTEGER_CST);
5325       index_type = TREE_TYPE (TYPE_MIN_VALUE (domain_type));
5326       low_bound = wi::to_offset (TYPE_MIN_VALUE (domain_type));
5327     }
5328   else
5329     low_bound = 0;
5330   /* Static constructors for variably sized objects makes no sense.  */
5331   gcc_assert (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor))))
5332 	      == INTEGER_CST);
5333   elt_size = wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor))));
5334 
5335   /* We can handle only constantly sized accesses that are known to not
5336      be larger than size of array element.  */
5337   if (!TYPE_SIZE_UNIT (type)
5338       || TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST
5339       || wi::lts_p (elt_size, wi::to_offset (TYPE_SIZE_UNIT (type)))
5340       || elt_size == 0)
5341     return NULL_TREE;
5342 
5343   /* Compute the array index we look for.  */
5344   access_index = wi::udiv_trunc (offset_int (offset / BITS_PER_UNIT),
5345 				 elt_size);
5346   access_index += low_bound;
5347   if (index_type)
5348     access_index = wi::ext (access_index, TYPE_PRECISION (index_type),
5349 			    TYPE_SIGN (index_type));
5350 
5351   /* And offset within the access.  */
5352   inner_offset = offset % (elt_size.to_uhwi () * BITS_PER_UNIT);
5353 
5354   /* See if the array field is large enough to span whole access.  We do not
5355      care to fold accesses spanning multiple array indexes.  */
5356   if (inner_offset + size > elt_size.to_uhwi () * BITS_PER_UNIT)
5357     return NULL_TREE;
5358 
5359   index = low_bound - 1;
5360   if (index_type)
5361     index = wi::ext (index, TYPE_PRECISION (index_type),
5362 		     TYPE_SIGN (index_type));
5363 
5364   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield, cval)
5365     {
5366       /* Array constructor might explicitely set index, or specify range
5367 	 or leave index NULL meaning that it is next index after previous
5368 	 one.  */
5369       if (cfield)
5370 	{
5371 	  if (TREE_CODE (cfield) == INTEGER_CST)
5372 	    max_index = index = wi::to_offset (cfield);
5373 	  else
5374 	    {
5375 	      gcc_assert (TREE_CODE (cfield) == RANGE_EXPR);
5376 	      index = wi::to_offset (TREE_OPERAND (cfield, 0));
5377 	      max_index = wi::to_offset (TREE_OPERAND (cfield, 1));
5378 	    }
5379 	}
5380       else
5381 	{
5382 	  index += 1;
5383 	  if (index_type)
5384 	    index = wi::ext (index, TYPE_PRECISION (index_type),
5385 			     TYPE_SIGN (index_type));
5386 	  max_index = index;
5387 	}
5388 
5389       /* Do we have match?  */
5390       if (wi::cmpu (access_index, index) >= 0
5391 	  && wi::cmpu (access_index, max_index) <= 0)
5392 	return fold_ctor_reference (type, cval, inner_offset, size,
5393 				    from_decl);
5394     }
5395   /* When memory is not explicitely mentioned in constructor,
5396      it is 0 (or out of range).  */
5397   return build_zero_cst (type);
5398 }
5399 
5400 /* CTOR is CONSTRUCTOR of an aggregate or vector.
5401    Fold reference of type TYPE and size SIZE to the memory at bit OFFSET.  */
5402 
5403 static tree
5404 fold_nonarray_ctor_reference (tree type, tree ctor,
5405 			      unsigned HOST_WIDE_INT offset,
5406 			      unsigned HOST_WIDE_INT size,
5407 			      tree from_decl)
5408 {
5409   unsigned HOST_WIDE_INT cnt;
5410   tree cfield, cval;
5411 
5412   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield,
5413 			    cval)
5414     {
5415       tree byte_offset = DECL_FIELD_OFFSET (cfield);
5416       tree field_offset = DECL_FIELD_BIT_OFFSET (cfield);
5417       tree field_size = DECL_SIZE (cfield);
5418       offset_int bitoffset;
5419       offset_int bitoffset_end, access_end;
5420 
5421       /* Variable sized objects in static constructors makes no sense,
5422 	 but field_size can be NULL for flexible array members.  */
5423       gcc_assert (TREE_CODE (field_offset) == INTEGER_CST
5424 		  && TREE_CODE (byte_offset) == INTEGER_CST
5425 		  && (field_size != NULL_TREE
5426 		      ? TREE_CODE (field_size) == INTEGER_CST
5427 		      : TREE_CODE (TREE_TYPE (cfield)) == ARRAY_TYPE));
5428 
5429       /* Compute bit offset of the field.  */
5430       bitoffset = (wi::to_offset (field_offset)
5431 		   + wi::lshift (wi::to_offset (byte_offset),
5432 				 LOG2_BITS_PER_UNIT));
5433       /* Compute bit offset where the field ends.  */
5434       if (field_size != NULL_TREE)
5435 	bitoffset_end = bitoffset + wi::to_offset (field_size);
5436       else
5437 	bitoffset_end = 0;
5438 
5439       access_end = offset_int (offset) + size;
5440 
5441       /* Is there any overlap between [OFFSET, OFFSET+SIZE) and
5442 	 [BITOFFSET, BITOFFSET_END)?  */
5443       if (wi::cmps (access_end, bitoffset) > 0
5444 	  && (field_size == NULL_TREE
5445 	      || wi::lts_p (offset, bitoffset_end)))
5446 	{
5447 	  offset_int inner_offset = offset_int (offset) - bitoffset;
5448 	  /* We do have overlap.  Now see if field is large enough to
5449 	     cover the access.  Give up for accesses spanning multiple
5450 	     fields.  */
5451 	  if (wi::cmps (access_end, bitoffset_end) > 0)
5452 	    return NULL_TREE;
5453 	  if (wi::lts_p (offset, bitoffset))
5454 	    return NULL_TREE;
5455 	  return fold_ctor_reference (type, cval,
5456 				      inner_offset.to_uhwi (), size,
5457 				      from_decl);
5458 	}
5459     }
5460   /* When memory is not explicitely mentioned in constructor, it is 0.  */
5461   return build_zero_cst (type);
5462 }
5463 
5464 /* CTOR is value initializing memory, fold reference of type TYPE and size SIZE
5465    to the memory at bit OFFSET.  */
5466 
5467 tree
5468 fold_ctor_reference (tree type, tree ctor, unsigned HOST_WIDE_INT offset,
5469 		     unsigned HOST_WIDE_INT size, tree from_decl)
5470 {
5471   tree ret;
5472 
5473   /* We found the field with exact match.  */
5474   if (useless_type_conversion_p (type, TREE_TYPE (ctor))
5475       && !offset)
5476     return canonicalize_constructor_val (unshare_expr (ctor), from_decl);
5477 
5478   /* We are at the end of walk, see if we can view convert the
5479      result.  */
5480   if (!AGGREGATE_TYPE_P (TREE_TYPE (ctor)) && !offset
5481       /* VIEW_CONVERT_EXPR is defined only for matching sizes.  */
5482       && !compare_tree_int (TYPE_SIZE (type), size)
5483       && !compare_tree_int (TYPE_SIZE (TREE_TYPE (ctor)), size))
5484     {
5485       ret = canonicalize_constructor_val (unshare_expr (ctor), from_decl);
5486       if (ret)
5487 	{
5488 	  ret = fold_unary (VIEW_CONVERT_EXPR, type, ret);
5489 	  if (ret)
5490 	    STRIP_USELESS_TYPE_CONVERSION (ret);
5491 	}
5492       return ret;
5493     }
5494   /* For constants and byte-aligned/sized reads try to go through
5495      native_encode/interpret.  */
5496   if (CONSTANT_CLASS_P (ctor)
5497       && BITS_PER_UNIT == 8
5498       && offset % BITS_PER_UNIT == 0
5499       && size % BITS_PER_UNIT == 0
5500       && size <= MAX_BITSIZE_MODE_ANY_MODE)
5501     {
5502       unsigned char buf[MAX_BITSIZE_MODE_ANY_MODE / BITS_PER_UNIT];
5503       if (native_encode_expr (ctor, buf, size / BITS_PER_UNIT,
5504 			      offset / BITS_PER_UNIT) > 0)
5505 	return native_interpret_expr (type, buf, size / BITS_PER_UNIT);
5506     }
5507   if (TREE_CODE (ctor) == CONSTRUCTOR)
5508     {
5509 
5510       if (TREE_CODE (TREE_TYPE (ctor)) == ARRAY_TYPE
5511 	  || TREE_CODE (TREE_TYPE (ctor)) == VECTOR_TYPE)
5512 	return fold_array_ctor_reference (type, ctor, offset, size,
5513 					  from_decl);
5514       else
5515 	return fold_nonarray_ctor_reference (type, ctor, offset, size,
5516 					     from_decl);
5517     }
5518 
5519   return NULL_TREE;
5520 }
5521 
5522 /* Return the tree representing the element referenced by T if T is an
5523    ARRAY_REF or COMPONENT_REF into constant aggregates valuezing SSA
5524    names using VALUEIZE.  Return NULL_TREE otherwise.  */
5525 
5526 tree
5527 fold_const_aggregate_ref_1 (tree t, tree (*valueize) (tree))
5528 {
5529   tree ctor, idx, base;
5530   HOST_WIDE_INT offset, size, max_size;
5531   tree tem;
5532 
5533   if (TREE_THIS_VOLATILE (t))
5534     return NULL_TREE;
5535 
5536   if (TREE_CODE_CLASS (TREE_CODE (t)) == tcc_declaration)
5537     return get_symbol_constant_value (t);
5538 
5539   tem = fold_read_from_constant_string (t);
5540   if (tem)
5541     return tem;
5542 
5543   switch (TREE_CODE (t))
5544     {
5545     case ARRAY_REF:
5546     case ARRAY_RANGE_REF:
5547       /* Constant indexes are handled well by get_base_constructor.
5548 	 Only special case variable offsets.
5549 	 FIXME: This code can't handle nested references with variable indexes
5550 	 (they will be handled only by iteration of ccp).  Perhaps we can bring
5551 	 get_ref_base_and_extent here and make it use a valueize callback.  */
5552       if (TREE_CODE (TREE_OPERAND (t, 1)) == SSA_NAME
5553 	  && valueize
5554 	  && (idx = (*valueize) (TREE_OPERAND (t, 1)))
5555 	  && TREE_CODE (idx) == INTEGER_CST)
5556 	{
5557 	  tree low_bound, unit_size;
5558 
5559 	  /* If the resulting bit-offset is constant, track it.  */
5560 	  if ((low_bound = array_ref_low_bound (t),
5561 	       TREE_CODE (low_bound) == INTEGER_CST)
5562 	      && (unit_size = array_ref_element_size (t),
5563 		  tree_fits_uhwi_p (unit_size)))
5564 	    {
5565 	      offset_int woffset
5566 		= wi::sext (wi::to_offset (idx) - wi::to_offset (low_bound),
5567 			    TYPE_PRECISION (TREE_TYPE (idx)));
5568 
5569 	      if (wi::fits_shwi_p (woffset))
5570 		{
5571 		  offset = woffset.to_shwi ();
5572 		  /* TODO: This code seems wrong, multiply then check
5573 		     to see if it fits.  */
5574 		  offset *= tree_to_uhwi (unit_size);
5575 		  offset *= BITS_PER_UNIT;
5576 
5577 		  base = TREE_OPERAND (t, 0);
5578 		  ctor = get_base_constructor (base, &offset, valueize);
5579 		  /* Empty constructor.  Always fold to 0.  */
5580 		  if (ctor == error_mark_node)
5581 		    return build_zero_cst (TREE_TYPE (t));
5582 		  /* Out of bound array access.  Value is undefined,
5583 		     but don't fold.  */
5584 		  if (offset < 0)
5585 		    return NULL_TREE;
5586 		  /* We can not determine ctor.  */
5587 		  if (!ctor)
5588 		    return NULL_TREE;
5589 		  return fold_ctor_reference (TREE_TYPE (t), ctor, offset,
5590 					      tree_to_uhwi (unit_size)
5591 					      * BITS_PER_UNIT,
5592 					      base);
5593 		}
5594 	    }
5595 	}
5596       /* Fallthru.  */
5597 
5598     case COMPONENT_REF:
5599     case BIT_FIELD_REF:
5600     case TARGET_MEM_REF:
5601     case MEM_REF:
5602       base = get_ref_base_and_extent (t, &offset, &size, &max_size);
5603       ctor = get_base_constructor (base, &offset, valueize);
5604 
5605       /* Empty constructor.  Always fold to 0.  */
5606       if (ctor == error_mark_node)
5607 	return build_zero_cst (TREE_TYPE (t));
5608       /* We do not know precise address.  */
5609       if (max_size == -1 || max_size != size)
5610 	return NULL_TREE;
5611       /* We can not determine ctor.  */
5612       if (!ctor)
5613 	return NULL_TREE;
5614 
5615       /* Out of bound array access.  Value is undefined, but don't fold.  */
5616       if (offset < 0)
5617 	return NULL_TREE;
5618 
5619       return fold_ctor_reference (TREE_TYPE (t), ctor, offset, size,
5620 				  base);
5621 
5622     case REALPART_EXPR:
5623     case IMAGPART_EXPR:
5624       {
5625 	tree c = fold_const_aggregate_ref_1 (TREE_OPERAND (t, 0), valueize);
5626 	if (c && TREE_CODE (c) == COMPLEX_CST)
5627 	  return fold_build1_loc (EXPR_LOCATION (t),
5628 			      TREE_CODE (t), TREE_TYPE (t), c);
5629 	break;
5630       }
5631 
5632     default:
5633       break;
5634     }
5635 
5636   return NULL_TREE;
5637 }
5638 
5639 tree
5640 fold_const_aggregate_ref (tree t)
5641 {
5642   return fold_const_aggregate_ref_1 (t, NULL);
5643 }
5644 
5645 /* Lookup virtual method with index TOKEN in a virtual table V
5646    at OFFSET.
5647    Set CAN_REFER if non-NULL to false if method
5648    is not referable or if the virtual table is ill-formed (such as rewriten
5649    by non-C++ produced symbol). Otherwise just return NULL in that calse.  */
5650 
5651 tree
5652 gimple_get_virt_method_for_vtable (HOST_WIDE_INT token,
5653 				   tree v,
5654 				   unsigned HOST_WIDE_INT offset,
5655 				   bool *can_refer)
5656 {
5657   tree vtable = v, init, fn;
5658   unsigned HOST_WIDE_INT size;
5659   unsigned HOST_WIDE_INT elt_size, access_index;
5660   tree domain_type;
5661 
5662   if (can_refer)
5663     *can_refer = true;
5664 
5665   /* First of all double check we have virtual table.  */
5666   if (TREE_CODE (v) != VAR_DECL
5667       || !DECL_VIRTUAL_P (v))
5668     {
5669       /* Pass down that we lost track of the target.  */
5670       if (can_refer)
5671 	*can_refer = false;
5672       return NULL_TREE;
5673     }
5674 
5675   init = ctor_for_folding (v);
5676 
5677   /* The virtual tables should always be born with constructors
5678      and we always should assume that they are avaialble for
5679      folding.  At the moment we do not stream them in all cases,
5680      but it should never happen that ctor seem unreachable.  */
5681   gcc_assert (init);
5682   if (init == error_mark_node)
5683     {
5684       gcc_assert (in_lto_p);
5685       /* Pass down that we lost track of the target.  */
5686       if (can_refer)
5687 	*can_refer = false;
5688       return NULL_TREE;
5689     }
5690   gcc_checking_assert (TREE_CODE (TREE_TYPE (v)) == ARRAY_TYPE);
5691   size = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (v))));
5692   offset *= BITS_PER_UNIT;
5693   offset += token * size;
5694 
5695   /* Lookup the value in the constructor that is assumed to be array.
5696      This is equivalent to
5697      fn = fold_ctor_reference (TREE_TYPE (TREE_TYPE (v)), init,
5698 			       offset, size, NULL);
5699      but in a constant time.  We expect that frontend produced a simple
5700      array without indexed initializers.  */
5701 
5702   gcc_checking_assert (TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE);
5703   domain_type = TYPE_DOMAIN (TREE_TYPE (init));
5704   gcc_checking_assert (integer_zerop (TYPE_MIN_VALUE (domain_type)));
5705   elt_size = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (init))));
5706 
5707   access_index = offset / BITS_PER_UNIT / elt_size;
5708   gcc_checking_assert (offset % (elt_size * BITS_PER_UNIT) == 0);
5709 
5710   /* This code makes an assumption that there are no
5711      indexed fileds produced by C++ FE, so we can directly index the array. */
5712   if (access_index < CONSTRUCTOR_NELTS (init))
5713     {
5714       fn = CONSTRUCTOR_ELT (init, access_index)->value;
5715       gcc_checking_assert (!CONSTRUCTOR_ELT (init, access_index)->index);
5716       STRIP_NOPS (fn);
5717     }
5718   else
5719     fn = NULL;
5720 
5721   /* For type inconsistent program we may end up looking up virtual method
5722      in virtual table that does not contain TOKEN entries.  We may overrun
5723      the virtual table and pick up a constant or RTTI info pointer.
5724      In any case the call is undefined.  */
5725   if (!fn
5726       || (TREE_CODE (fn) != ADDR_EXPR && TREE_CODE (fn) != FDESC_EXPR)
5727       || TREE_CODE (TREE_OPERAND (fn, 0)) != FUNCTION_DECL)
5728     fn = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
5729   else
5730     {
5731       fn = TREE_OPERAND (fn, 0);
5732 
5733       /* When cgraph node is missing and function is not public, we cannot
5734 	 devirtualize.  This can happen in WHOPR when the actual method
5735 	 ends up in other partition, because we found devirtualization
5736 	 possibility too late.  */
5737       if (!can_refer_decl_in_current_unit_p (fn, vtable))
5738 	{
5739 	  if (can_refer)
5740 	    {
5741 	      *can_refer = false;
5742 	      return fn;
5743 	    }
5744 	  return NULL_TREE;
5745 	}
5746     }
5747 
5748   /* Make sure we create a cgraph node for functions we'll reference.
5749      They can be non-existent if the reference comes from an entry
5750      of an external vtable for example.  */
5751   cgraph_node::get_create (fn);
5752 
5753   return fn;
5754 }
5755 
5756 /* Return a declaration of a function which an OBJ_TYPE_REF references. TOKEN
5757    is integer form of OBJ_TYPE_REF_TOKEN of the reference expression.
5758    KNOWN_BINFO carries the binfo describing the true type of
5759    OBJ_TYPE_REF_OBJECT(REF).
5760    Set CAN_REFER if non-NULL to false if method
5761    is not referable or if the virtual table is ill-formed (such as rewriten
5762    by non-C++ produced symbol). Otherwise just return NULL in that calse.  */
5763 
5764 tree
5765 gimple_get_virt_method_for_binfo (HOST_WIDE_INT token, tree known_binfo,
5766 				  bool *can_refer)
5767 {
5768   unsigned HOST_WIDE_INT offset;
5769   tree v;
5770 
5771   v = BINFO_VTABLE (known_binfo);
5772   /* If there is no virtual methods table, leave the OBJ_TYPE_REF alone.  */
5773   if (!v)
5774     return NULL_TREE;
5775 
5776   if (!vtable_pointer_value_to_vtable (v, &v, &offset))
5777     {
5778       if (can_refer)
5779 	*can_refer = false;
5780       return NULL_TREE;
5781     }
5782   return gimple_get_virt_method_for_vtable (token, v, offset, can_refer);
5783 }
5784 
5785 /* Return true iff VAL is a gimple expression that is known to be
5786    non-negative.  Restricted to floating-point inputs.  */
5787 
5788 bool
5789 gimple_val_nonnegative_real_p (tree val)
5790 {
5791   gimple def_stmt;
5792 
5793   gcc_assert (val && SCALAR_FLOAT_TYPE_P (TREE_TYPE (val)));
5794 
5795   /* Use existing logic for non-gimple trees.  */
5796   if (tree_expr_nonnegative_p (val))
5797     return true;
5798 
5799   if (TREE_CODE (val) != SSA_NAME)
5800     return false;
5801 
5802   /* Currently we look only at the immediately defining statement
5803      to make this determination, since recursion on defining
5804      statements of operands can lead to quadratic behavior in the
5805      worst case.  This is expected to catch almost all occurrences
5806      in practice.  It would be possible to implement limited-depth
5807      recursion if important cases are lost.  Alternatively, passes
5808      that need this information (such as the pow/powi lowering code
5809      in the cse_sincos pass) could be revised to provide it through
5810      dataflow propagation.  */
5811 
5812   def_stmt = SSA_NAME_DEF_STMT (val);
5813 
5814   if (is_gimple_assign (def_stmt))
5815     {
5816       tree op0, op1;
5817 
5818       /* See fold-const.c:tree_expr_nonnegative_p for additional
5819 	 cases that could be handled with recursion.  */
5820 
5821       switch (gimple_assign_rhs_code (def_stmt))
5822 	{
5823 	case ABS_EXPR:
5824 	  /* Always true for floating-point operands.  */
5825 	  return true;
5826 
5827 	case MULT_EXPR:
5828 	  /* True if the two operands are identical (since we are
5829 	     restricted to floating-point inputs).  */
5830 	  op0 = gimple_assign_rhs1 (def_stmt);
5831 	  op1 = gimple_assign_rhs2 (def_stmt);
5832 
5833 	  if (op0 == op1
5834 	      || operand_equal_p (op0, op1, 0))
5835 	    return true;
5836 
5837 	default:
5838 	  return false;
5839 	}
5840     }
5841   else if (is_gimple_call (def_stmt))
5842     {
5843       tree fndecl = gimple_call_fndecl (def_stmt);
5844       if (fndecl
5845 	  && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
5846 	{
5847 	  tree arg1;
5848 
5849 	  switch (DECL_FUNCTION_CODE (fndecl))
5850 	    {
5851 	    CASE_FLT_FN (BUILT_IN_ACOS):
5852 	    CASE_FLT_FN (BUILT_IN_ACOSH):
5853 	    CASE_FLT_FN (BUILT_IN_CABS):
5854 	    CASE_FLT_FN (BUILT_IN_COSH):
5855 	    CASE_FLT_FN (BUILT_IN_ERFC):
5856 	    CASE_FLT_FN (BUILT_IN_EXP):
5857 	    CASE_FLT_FN (BUILT_IN_EXP10):
5858 	    CASE_FLT_FN (BUILT_IN_EXP2):
5859 	    CASE_FLT_FN (BUILT_IN_FABS):
5860 	    CASE_FLT_FN (BUILT_IN_FDIM):
5861 	    CASE_FLT_FN (BUILT_IN_HYPOT):
5862 	    CASE_FLT_FN (BUILT_IN_POW10):
5863 	      return true;
5864 
5865 	    CASE_FLT_FN (BUILT_IN_SQRT):
5866 	      /* sqrt(-0.0) is -0.0, and sqrt is not defined over other
5867 		 nonnegative inputs.  */
5868 	      if (!HONOR_SIGNED_ZEROS (val))
5869 		return true;
5870 
5871 	      break;
5872 
5873 	    CASE_FLT_FN (BUILT_IN_POWI):
5874 	      /* True if the second argument is an even integer.  */
5875 	      arg1 = gimple_call_arg (def_stmt, 1);
5876 
5877 	      if (TREE_CODE (arg1) == INTEGER_CST
5878 		  && (TREE_INT_CST_LOW (arg1) & 1) == 0)
5879 		return true;
5880 
5881 	      break;
5882 
5883 	    CASE_FLT_FN (BUILT_IN_POW):
5884 	      /* True if the second argument is an even integer-valued
5885 		 real.  */
5886 	      arg1 = gimple_call_arg (def_stmt, 1);
5887 
5888 	      if (TREE_CODE (arg1) == REAL_CST)
5889 		{
5890 		  REAL_VALUE_TYPE c;
5891 		  HOST_WIDE_INT n;
5892 
5893 		  c = TREE_REAL_CST (arg1);
5894 		  n = real_to_integer (&c);
5895 
5896 		  if ((n & 1) == 0)
5897 		    {
5898 		      REAL_VALUE_TYPE cint;
5899 		      real_from_integer (&cint, VOIDmode, n, SIGNED);
5900 		      if (real_identical (&c, &cint))
5901 			return true;
5902 		    }
5903 		}
5904 
5905 	      break;
5906 
5907 	    default:
5908 	      return false;
5909 	    }
5910 	}
5911     }
5912 
5913   return false;
5914 }
5915 
5916 /* Given a pointer value OP0, return a simplified version of an
5917    indirection through OP0, or NULL_TREE if no simplification is
5918    possible.  Note that the resulting type may be different from
5919    the type pointed to in the sense that it is still compatible
5920    from the langhooks point of view. */
5921 
5922 tree
5923 gimple_fold_indirect_ref (tree t)
5924 {
5925   tree ptype = TREE_TYPE (t), type = TREE_TYPE (ptype);
5926   tree sub = t;
5927   tree subtype;
5928 
5929   STRIP_NOPS (sub);
5930   subtype = TREE_TYPE (sub);
5931   if (!POINTER_TYPE_P (subtype))
5932     return NULL_TREE;
5933 
5934   if (TREE_CODE (sub) == ADDR_EXPR)
5935     {
5936       tree op = TREE_OPERAND (sub, 0);
5937       tree optype = TREE_TYPE (op);
5938       /* *&p => p */
5939       if (useless_type_conversion_p (type, optype))
5940         return op;
5941 
5942       /* *(foo *)&fooarray => fooarray[0] */
5943       if (TREE_CODE (optype) == ARRAY_TYPE
5944 	  && TREE_CODE (TYPE_SIZE (TREE_TYPE (optype))) == INTEGER_CST
5945 	  && useless_type_conversion_p (type, TREE_TYPE (optype)))
5946        {
5947          tree type_domain = TYPE_DOMAIN (optype);
5948          tree min_val = size_zero_node;
5949          if (type_domain && TYPE_MIN_VALUE (type_domain))
5950            min_val = TYPE_MIN_VALUE (type_domain);
5951 	 if (TREE_CODE (min_val) == INTEGER_CST)
5952 	   return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
5953        }
5954       /* *(foo *)&complexfoo => __real__ complexfoo */
5955       else if (TREE_CODE (optype) == COMPLEX_TYPE
5956                && useless_type_conversion_p (type, TREE_TYPE (optype)))
5957         return fold_build1 (REALPART_EXPR, type, op);
5958       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
5959       else if (TREE_CODE (optype) == VECTOR_TYPE
5960                && useless_type_conversion_p (type, TREE_TYPE (optype)))
5961         {
5962           tree part_width = TYPE_SIZE (type);
5963           tree index = bitsize_int (0);
5964           return fold_build3 (BIT_FIELD_REF, type, op, part_width, index);
5965         }
5966     }
5967 
5968   /* *(p + CST) -> ...  */
5969   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
5970       && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
5971     {
5972       tree addr = TREE_OPERAND (sub, 0);
5973       tree off = TREE_OPERAND (sub, 1);
5974       tree addrtype;
5975 
5976       STRIP_NOPS (addr);
5977       addrtype = TREE_TYPE (addr);
5978 
5979       /* ((foo*)&vectorfoo)[1] -> BIT_FIELD_REF<vectorfoo,...> */
5980       if (TREE_CODE (addr) == ADDR_EXPR
5981 	  && TREE_CODE (TREE_TYPE (addrtype)) == VECTOR_TYPE
5982 	  && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (addrtype)))
5983 	  && tree_fits_uhwi_p (off))
5984 	{
5985           unsigned HOST_WIDE_INT offset = tree_to_uhwi (off);
5986           tree part_width = TYPE_SIZE (type);
5987           unsigned HOST_WIDE_INT part_widthi
5988             = tree_to_shwi (part_width) / BITS_PER_UNIT;
5989           unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
5990           tree index = bitsize_int (indexi);
5991           if (offset / part_widthi
5992 	      < TYPE_VECTOR_SUBPARTS (TREE_TYPE (addrtype)))
5993             return fold_build3 (BIT_FIELD_REF, type, TREE_OPERAND (addr, 0),
5994                                 part_width, index);
5995 	}
5996 
5997       /* ((foo*)&complexfoo)[1] -> __imag__ complexfoo */
5998       if (TREE_CODE (addr) == ADDR_EXPR
5999 	  && TREE_CODE (TREE_TYPE (addrtype)) == COMPLEX_TYPE
6000 	  && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (addrtype))))
6001         {
6002           tree size = TYPE_SIZE_UNIT (type);
6003           if (tree_int_cst_equal (size, off))
6004             return fold_build1 (IMAGPART_EXPR, type, TREE_OPERAND (addr, 0));
6005         }
6006 
6007       /* *(p + CST) -> MEM_REF <p, CST>.  */
6008       if (TREE_CODE (addr) != ADDR_EXPR
6009 	  || DECL_P (TREE_OPERAND (addr, 0)))
6010 	return fold_build2 (MEM_REF, type,
6011 			    addr,
6012 			    wide_int_to_tree (ptype, off));
6013     }
6014 
6015   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
6016   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
6017       && TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (subtype)))) == INTEGER_CST
6018       && useless_type_conversion_p (type, TREE_TYPE (TREE_TYPE (subtype))))
6019     {
6020       tree type_domain;
6021       tree min_val = size_zero_node;
6022       tree osub = sub;
6023       sub = gimple_fold_indirect_ref (sub);
6024       if (! sub)
6025 	sub = build1 (INDIRECT_REF, TREE_TYPE (subtype), osub);
6026       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
6027       if (type_domain && TYPE_MIN_VALUE (type_domain))
6028         min_val = TYPE_MIN_VALUE (type_domain);
6029       if (TREE_CODE (min_val) == INTEGER_CST)
6030 	return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
6031     }
6032 
6033   return NULL_TREE;
6034 }
6035 
6036 /* Return true if CODE is an operation that when operating on signed
6037    integer types involves undefined behavior on overflow and the
6038    operation can be expressed with unsigned arithmetic.  */
6039 
6040 bool
6041 arith_code_with_undefined_signed_overflow (tree_code code)
6042 {
6043   switch (code)
6044     {
6045     case PLUS_EXPR:
6046     case MINUS_EXPR:
6047     case MULT_EXPR:
6048     case NEGATE_EXPR:
6049     case POINTER_PLUS_EXPR:
6050       return true;
6051     default:
6052       return false;
6053     }
6054 }
6055 
6056 /* Rewrite STMT, an assignment with a signed integer or pointer arithmetic
6057    operation that can be transformed to unsigned arithmetic by converting
6058    its operand, carrying out the operation in the corresponding unsigned
6059    type and converting the result back to the original type.
6060 
6061    Returns a sequence of statements that replace STMT and also contain
6062    a modified form of STMT itself.  */
6063 
6064 gimple_seq
6065 rewrite_to_defined_overflow (gimple stmt)
6066 {
6067   if (dump_file && (dump_flags & TDF_DETAILS))
6068     {
6069       fprintf (dump_file, "rewriting stmt with undefined signed "
6070 	       "overflow ");
6071       print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
6072     }
6073 
6074   tree lhs = gimple_assign_lhs (stmt);
6075   tree type = unsigned_type_for (TREE_TYPE (lhs));
6076   gimple_seq stmts = NULL;
6077   for (unsigned i = 1; i < gimple_num_ops (stmt); ++i)
6078     {
6079       gimple_seq stmts2 = NULL;
6080       gimple_set_op (stmt, i,
6081 		     force_gimple_operand (fold_convert (type,
6082 							 gimple_op (stmt, i)),
6083 					   &stmts2, true, NULL_TREE));
6084       gimple_seq_add_seq (&stmts, stmts2);
6085     }
6086   gimple_assign_set_lhs (stmt, make_ssa_name (type, stmt));
6087   if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR)
6088     gimple_assign_set_rhs_code (stmt, PLUS_EXPR);
6089   gimple_seq_add_stmt (&stmts, stmt);
6090   gimple cvt = gimple_build_assign (lhs, NOP_EXPR, gimple_assign_lhs (stmt));
6091   gimple_seq_add_stmt (&stmts, cvt);
6092 
6093   return stmts;
6094 }
6095 
6096 
6097 /* Build the expression CODE OP0 of type TYPE with location LOC,
6098    simplifying it first if possible using VALUEIZE if not NULL.
6099    OP0 is expected to be valueized already.  Returns the built
6100    expression value and appends statements possibly defining it
6101    to SEQ.  */
6102 
6103 tree
6104 gimple_build (gimple_seq *seq, location_t loc,
6105 	      enum tree_code code, tree type, tree op0,
6106 	      tree (*valueize)(tree))
6107 {
6108   tree res = gimple_simplify (code, type, op0, seq, valueize);
6109   if (!res)
6110     {
6111       if (gimple_in_ssa_p (cfun))
6112 	res = make_ssa_name (type);
6113       else
6114 	res = create_tmp_reg (type);
6115       gimple stmt;
6116       if (code == REALPART_EXPR
6117 	  || code == IMAGPART_EXPR
6118 	  || code == VIEW_CONVERT_EXPR)
6119 	stmt = gimple_build_assign (res, code, build1 (code, type, op0));
6120       else
6121 	stmt = gimple_build_assign (res, code, op0);
6122       gimple_set_location (stmt, loc);
6123       gimple_seq_add_stmt_without_update (seq, stmt);
6124     }
6125   return res;
6126 }
6127 
6128 /* Build the expression OP0 CODE OP1 of type TYPE with location LOC,
6129    simplifying it first if possible using VALUEIZE if not NULL.
6130    OP0 and OP1 are expected to be valueized already.  Returns the built
6131    expression value and appends statements possibly defining it
6132    to SEQ.  */
6133 
6134 tree
6135 gimple_build (gimple_seq *seq, location_t loc,
6136 	      enum tree_code code, tree type, tree op0, tree op1,
6137 	      tree (*valueize)(tree))
6138 {
6139   tree res = gimple_simplify (code, type, op0, op1, seq, valueize);
6140   if (!res)
6141     {
6142       if (gimple_in_ssa_p (cfun))
6143 	res = make_ssa_name (type);
6144       else
6145 	res = create_tmp_reg (type);
6146       gimple stmt = gimple_build_assign (res, code, op0, op1);
6147       gimple_set_location (stmt, loc);
6148       gimple_seq_add_stmt_without_update (seq, stmt);
6149     }
6150   return res;
6151 }
6152 
6153 /* Build the expression (CODE OP0 OP1 OP2) of type TYPE with location LOC,
6154    simplifying it first if possible using VALUEIZE if not NULL.
6155    OP0, OP1 and OP2 are expected to be valueized already.  Returns the built
6156    expression value and appends statements possibly defining it
6157    to SEQ.  */
6158 
6159 tree
6160 gimple_build (gimple_seq *seq, location_t loc,
6161 	      enum tree_code code, tree type, tree op0, tree op1, tree op2,
6162 	      tree (*valueize)(tree))
6163 {
6164   tree res = gimple_simplify (code, type, op0, op1, op2,
6165 			      seq, valueize);
6166   if (!res)
6167     {
6168       if (gimple_in_ssa_p (cfun))
6169 	res = make_ssa_name (type);
6170       else
6171 	res = create_tmp_reg (type);
6172       gimple stmt;
6173       if (code == BIT_FIELD_REF)
6174 	stmt = gimple_build_assign (res, code,
6175 				    build3 (code, type, op0, op1, op2));
6176       else
6177 	stmt = gimple_build_assign (res, code, op0, op1, op2);
6178       gimple_set_location (stmt, loc);
6179       gimple_seq_add_stmt_without_update (seq, stmt);
6180     }
6181   return res;
6182 }
6183 
6184 /* Build the call FN (ARG0) with a result of type TYPE
6185    (or no result if TYPE is void) with location LOC,
6186    simplifying it first if possible using VALUEIZE if not NULL.
6187    ARG0 is expected to be valueized already.  Returns the built
6188    expression value (or NULL_TREE if TYPE is void) and appends
6189    statements possibly defining it to SEQ.  */
6190 
6191 tree
6192 gimple_build (gimple_seq *seq, location_t loc,
6193 	      enum built_in_function fn, tree type, tree arg0,
6194 	      tree (*valueize)(tree))
6195 {
6196   tree res = gimple_simplify (fn, type, arg0, seq, valueize);
6197   if (!res)
6198     {
6199       tree decl = builtin_decl_implicit (fn);
6200       gimple stmt = gimple_build_call (decl, 1, arg0);
6201       if (!VOID_TYPE_P (type))
6202 	{
6203 	  if (gimple_in_ssa_p (cfun))
6204 	    res = make_ssa_name (type);
6205 	  else
6206 	    res = create_tmp_reg (type);
6207 	  gimple_call_set_lhs (stmt, res);
6208 	}
6209       gimple_set_location (stmt, loc);
6210       gimple_seq_add_stmt_without_update (seq, stmt);
6211     }
6212   return res;
6213 }
6214 
6215 /* Build the call FN (ARG0, ARG1) with a result of type TYPE
6216    (or no result if TYPE is void) with location LOC,
6217    simplifying it first if possible using VALUEIZE if not NULL.
6218    ARG0 is expected to be valueized already.  Returns the built
6219    expression value (or NULL_TREE if TYPE is void) and appends
6220    statements possibly defining it to SEQ.  */
6221 
6222 tree
6223 gimple_build (gimple_seq *seq, location_t loc,
6224 	      enum built_in_function fn, tree type, tree arg0, tree arg1,
6225 	      tree (*valueize)(tree))
6226 {
6227   tree res = gimple_simplify (fn, type, arg0, arg1, seq, valueize);
6228   if (!res)
6229     {
6230       tree decl = builtin_decl_implicit (fn);
6231       gimple stmt = gimple_build_call (decl, 2, arg0, arg1);
6232       if (!VOID_TYPE_P (type))
6233 	{
6234 	  if (gimple_in_ssa_p (cfun))
6235 	    res = make_ssa_name (type);
6236 	  else
6237 	    res = create_tmp_reg (type);
6238 	  gimple_call_set_lhs (stmt, res);
6239 	}
6240       gimple_set_location (stmt, loc);
6241       gimple_seq_add_stmt_without_update (seq, stmt);
6242     }
6243   return res;
6244 }
6245 
6246 /* Build the call FN (ARG0, ARG1, ARG2) with a result of type TYPE
6247    (or no result if TYPE is void) with location LOC,
6248    simplifying it first if possible using VALUEIZE if not NULL.
6249    ARG0 is expected to be valueized already.  Returns the built
6250    expression value (or NULL_TREE if TYPE is void) and appends
6251    statements possibly defining it to SEQ.  */
6252 
6253 tree
6254 gimple_build (gimple_seq *seq, location_t loc,
6255 	      enum built_in_function fn, tree type,
6256 	      tree arg0, tree arg1, tree arg2,
6257 	      tree (*valueize)(tree))
6258 {
6259   tree res = gimple_simplify (fn, type, arg0, arg1, arg2, seq, valueize);
6260   if (!res)
6261     {
6262       tree decl = builtin_decl_implicit (fn);
6263       gimple stmt = gimple_build_call (decl, 3, arg0, arg1, arg2);
6264       if (!VOID_TYPE_P (type))
6265 	{
6266 	  if (gimple_in_ssa_p (cfun))
6267 	    res = make_ssa_name (type);
6268 	  else
6269 	    res = create_tmp_reg (type);
6270 	  gimple_call_set_lhs (stmt, res);
6271 	}
6272       gimple_set_location (stmt, loc);
6273       gimple_seq_add_stmt_without_update (seq, stmt);
6274     }
6275   return res;
6276 }
6277 
6278 /* Build the conversion (TYPE) OP with a result of type TYPE
6279    with location LOC if such conversion is neccesary in GIMPLE,
6280    simplifying it first.
6281    Returns the built expression value and appends
6282    statements possibly defining it to SEQ.  */
6283 
6284 tree
6285 gimple_convert (gimple_seq *seq, location_t loc, tree type, tree op)
6286 {
6287   if (useless_type_conversion_p (type, TREE_TYPE (op)))
6288     return op;
6289   return gimple_build (seq, loc, NOP_EXPR, type, op);
6290 }
6291