xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/tree-ssa-forwprop.c (revision c38e7cc395b1472a774ff828e46123de44c628e9)
1 /* Forward propagation of expressions for single use variables.
2    Copyright (C) 2004-2015 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10 
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "hash-set.h"
25 #include "machmode.h"
26 #include "vec.h"
27 #include "double-int.h"
28 #include "input.h"
29 #include "alias.h"
30 #include "symtab.h"
31 #include "wide-int.h"
32 #include "inchash.h"
33 #include "tree.h"
34 #include "fold-const.h"
35 #include "stor-layout.h"
36 #include "tm_p.h"
37 #include "predict.h"
38 #include "hard-reg-set.h"
39 #include "function.h"
40 #include "dominance.h"
41 #include "cfg.h"
42 #include "basic-block.h"
43 #include "gimple-pretty-print.h"
44 #include "tree-ssa-alias.h"
45 #include "internal-fn.h"
46 #include "gimple-fold.h"
47 #include "tree-eh.h"
48 #include "gimple-expr.h"
49 #include "is-a.h"
50 #include "gimple.h"
51 #include "gimplify.h"
52 #include "gimple-iterator.h"
53 #include "gimplify-me.h"
54 #include "gimple-ssa.h"
55 #include "tree-cfg.h"
56 #include "tree-phinodes.h"
57 #include "ssa-iterators.h"
58 #include "stringpool.h"
59 #include "tree-ssanames.h"
60 #include "hashtab.h"
61 #include "rtl.h"
62 #include "flags.h"
63 #include "statistics.h"
64 #include "real.h"
65 #include "fixed-value.h"
66 #include "insn-config.h"
67 #include "expmed.h"
68 #include "dojump.h"
69 #include "explow.h"
70 #include "calls.h"
71 #include "emit-rtl.h"
72 #include "varasm.h"
73 #include "stmt.h"
74 #include "expr.h"
75 #include "tree-dfa.h"
76 #include "tree-pass.h"
77 #include "langhooks.h"
78 #include "diagnostic.h"
79 #include "cfgloop.h"
80 #include "insn-codes.h"
81 #include "optabs.h"
82 #include "tree-ssa-propagate.h"
83 #include "tree-ssa-dom.h"
84 #include "builtins.h"
85 #include "tree-cfgcleanup.h"
86 #include "tree-into-ssa.h"
87 #include "cfganal.h"
88 
89 /* This pass propagates the RHS of assignment statements into use
90    sites of the LHS of the assignment.  It's basically a specialized
91    form of tree combination.   It is hoped all of this can disappear
92    when we have a generalized tree combiner.
93 
94    One class of common cases we handle is forward propagating a single use
95    variable into a COND_EXPR.
96 
97      bb0:
98        x = a COND b;
99        if (x) goto ... else goto ...
100 
101    Will be transformed into:
102 
103      bb0:
104        if (a COND b) goto ... else goto ...
105 
106    Similarly for the tests (x == 0), (x != 0), (x == 1) and (x != 1).
107 
108    Or (assuming c1 and c2 are constants):
109 
110      bb0:
111        x = a + c1;
112        if (x EQ/NEQ c2) goto ... else goto ...
113 
114    Will be transformed into:
115 
116      bb0:
117         if (a EQ/NEQ (c2 - c1)) goto ... else goto ...
118 
119    Similarly for x = a - c1.
120 
121    Or
122 
123      bb0:
124        x = !a
125        if (x) goto ... else goto ...
126 
127    Will be transformed into:
128 
129      bb0:
130         if (a == 0) goto ... else goto ...
131 
132    Similarly for the tests (x == 0), (x != 0), (x == 1) and (x != 1).
133    For these cases, we propagate A into all, possibly more than one,
134    COND_EXPRs that use X.
135 
136    Or
137 
138      bb0:
139        x = (typecast) a
140        if (x) goto ... else goto ...
141 
142    Will be transformed into:
143 
144      bb0:
145         if (a != 0) goto ... else goto ...
146 
147    (Assuming a is an integral type and x is a boolean or x is an
148     integral and a is a boolean.)
149 
150    Similarly for the tests (x == 0), (x != 0), (x == 1) and (x != 1).
151    For these cases, we propagate A into all, possibly more than one,
152    COND_EXPRs that use X.
153 
154    In addition to eliminating the variable and the statement which assigns
155    a value to the variable, we may be able to later thread the jump without
156    adding insane complexity in the dominator optimizer.
157 
158    Also note these transformations can cascade.  We handle this by having
159    a worklist of COND_EXPR statements to examine.  As we make a change to
160    a statement, we put it back on the worklist to examine on the next
161    iteration of the main loop.
162 
163    A second class of propagation opportunities arises for ADDR_EXPR
164    nodes.
165 
166      ptr = &x->y->z;
167      res = *ptr;
168 
169    Will get turned into
170 
171      res = x->y->z;
172 
173    Or
174      ptr = (type1*)&type2var;
175      res = *ptr
176 
177    Will get turned into (if type1 and type2 are the same size
178    and neither have volatile on them):
179      res = VIEW_CONVERT_EXPR<type1>(type2var)
180 
181    Or
182 
183      ptr = &x[0];
184      ptr2 = ptr + <constant>;
185 
186    Will get turned into
187 
188      ptr2 = &x[constant/elementsize];
189 
190   Or
191 
192      ptr = &x[0];
193      offset = index * element_size;
194      offset_p = (pointer) offset;
195      ptr2 = ptr + offset_p
196 
197   Will get turned into:
198 
199      ptr2 = &x[index];
200 
201   Or
202     ssa = (int) decl
203     res = ssa & 1
204 
205   Provided that decl has known alignment >= 2, will get turned into
206 
207     res = 0
208 
209   We also propagate casts into SWITCH_EXPR and COND_EXPR conditions to
210   allow us to remove the cast and {NOT_EXPR,NEG_EXPR} into a subsequent
211   {NOT_EXPR,NEG_EXPR}.
212 
213    This will (of course) be extended as other needs arise.  */
214 
215 static bool forward_propagate_addr_expr (tree, tree, bool);
216 
217 /* Set to true if we delete dead edges during the optimization.  */
218 static bool cfg_changed;
219 
220 static tree rhs_to_tree (tree type, gimple stmt);
221 
222 static bitmap to_purge;
223 
224 /* Const-and-copy lattice.  */
225 static vec<tree> lattice;
226 
227 /* Set the lattice entry for NAME to VAL.  */
228 static void
229 fwprop_set_lattice_val (tree name, tree val)
230 {
231   if (TREE_CODE (name) == SSA_NAME)
232     {
233       if (SSA_NAME_VERSION (name) >= lattice.length ())
234 	{
235 	  lattice.reserve (num_ssa_names - lattice.length ());
236 	  lattice.quick_grow_cleared (num_ssa_names);
237 	}
238       lattice[SSA_NAME_VERSION (name)] = val;
239     }
240 }
241 
242 /* Invalidate the lattice entry for NAME, done when releasing SSA names.  */
243 static void
244 fwprop_invalidate_lattice (tree name)
245 {
246   if (name
247       && TREE_CODE (name) == SSA_NAME
248       && SSA_NAME_VERSION (name) < lattice.length ())
249     lattice[SSA_NAME_VERSION (name)] = NULL_TREE;
250 }
251 
252 
253 /* Get the statement we can propagate from into NAME skipping
254    trivial copies.  Returns the statement which defines the
255    propagation source or NULL_TREE if there is no such one.
256    If SINGLE_USE_ONLY is set considers only sources which have
257    a single use chain up to NAME.  If SINGLE_USE_P is non-null,
258    it is set to whether the chain to NAME is a single use chain
259    or not.  SINGLE_USE_P is not written to if SINGLE_USE_ONLY is set.  */
260 
261 static gimple
262 get_prop_source_stmt (tree name, bool single_use_only, bool *single_use_p)
263 {
264   bool single_use = true;
265 
266   do {
267     gimple def_stmt = SSA_NAME_DEF_STMT (name);
268 
269     if (!has_single_use (name))
270       {
271 	single_use = false;
272 	if (single_use_only)
273 	  return NULL;
274       }
275 
276     /* If name is defined by a PHI node or is the default def, bail out.  */
277     if (!is_gimple_assign (def_stmt))
278       return NULL;
279 
280     /* If def_stmt is a simple copy, continue looking.  */
281     if (gimple_assign_rhs_code (def_stmt) == SSA_NAME)
282       name = gimple_assign_rhs1 (def_stmt);
283     else
284       {
285 	if (!single_use_only && single_use_p)
286 	  *single_use_p = single_use;
287 
288 	return def_stmt;
289       }
290   } while (1);
291 }
292 
293 /* Checks if the destination ssa name in DEF_STMT can be used as
294    propagation source.  Returns true if so, otherwise false.  */
295 
296 static bool
297 can_propagate_from (gimple def_stmt)
298 {
299   gcc_assert (is_gimple_assign (def_stmt));
300 
301   /* If the rhs has side-effects we cannot propagate from it.  */
302   if (gimple_has_volatile_ops (def_stmt))
303     return false;
304 
305   /* If the rhs is a load we cannot propagate from it.  */
306   if (TREE_CODE_CLASS (gimple_assign_rhs_code (def_stmt)) == tcc_reference
307       || TREE_CODE_CLASS (gimple_assign_rhs_code (def_stmt)) == tcc_declaration)
308     return false;
309 
310   /* Constants can be always propagated.  */
311   if (gimple_assign_single_p (def_stmt)
312       && is_gimple_min_invariant (gimple_assign_rhs1 (def_stmt)))
313     return true;
314 
315   /* We cannot propagate ssa names that occur in abnormal phi nodes.  */
316   if (stmt_references_abnormal_ssa_name (def_stmt))
317     return false;
318 
319   /* If the definition is a conversion of a pointer to a function type,
320      then we can not apply optimizations as some targets require
321      function pointers to be canonicalized and in this case this
322      optimization could eliminate a necessary canonicalization.  */
323   if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt)))
324     {
325       tree rhs = gimple_assign_rhs1 (def_stmt);
326       if (POINTER_TYPE_P (TREE_TYPE (rhs))
327           && TREE_CODE (TREE_TYPE (TREE_TYPE (rhs))) == FUNCTION_TYPE)
328         return false;
329     }
330 
331   return true;
332 }
333 
334 /* Remove a chain of dead statements starting at the definition of
335    NAME.  The chain is linked via the first operand of the defining statements.
336    If NAME was replaced in its only use then this function can be used
337    to clean up dead stmts.  The function handles already released SSA
338    names gracefully.
339    Returns true if cleanup-cfg has to run.  */
340 
341 static bool
342 remove_prop_source_from_use (tree name)
343 {
344   gimple_stmt_iterator gsi;
345   gimple stmt;
346   bool cfg_changed = false;
347 
348   do {
349     basic_block bb;
350 
351     if (SSA_NAME_IN_FREE_LIST (name)
352 	|| SSA_NAME_IS_DEFAULT_DEF (name)
353 	|| !has_zero_uses (name))
354       return cfg_changed;
355 
356     stmt = SSA_NAME_DEF_STMT (name);
357     if (gimple_code (stmt) == GIMPLE_PHI
358 	|| gimple_has_side_effects (stmt))
359       return cfg_changed;
360 
361     bb = gimple_bb (stmt);
362     gsi = gsi_for_stmt (stmt);
363     unlink_stmt_vdef (stmt);
364     if (gsi_remove (&gsi, true))
365       bitmap_set_bit (to_purge, bb->index);
366     fwprop_invalidate_lattice (gimple_get_lhs (stmt));
367     release_defs (stmt);
368 
369     name = is_gimple_assign (stmt) ? gimple_assign_rhs1 (stmt) : NULL_TREE;
370   } while (name && TREE_CODE (name) == SSA_NAME);
371 
372   return cfg_changed;
373 }
374 
375 /* Return the rhs of a gassign *STMT in a form of a single tree,
376    converted to type TYPE.
377 
378    This should disappear, but is needed so we can combine expressions and use
379    the fold() interfaces. Long term, we need to develop folding and combine
380    routines that deal with gimple exclusively . */
381 
382 static tree
383 rhs_to_tree (tree type, gimple stmt)
384 {
385   location_t loc = gimple_location (stmt);
386   enum tree_code code = gimple_assign_rhs_code (stmt);
387   if (get_gimple_rhs_class (code) == GIMPLE_TERNARY_RHS)
388     return fold_build3_loc (loc, code, type, gimple_assign_rhs1 (stmt),
389 			    gimple_assign_rhs2 (stmt),
390 			    gimple_assign_rhs3 (stmt));
391   else if (get_gimple_rhs_class (code) == GIMPLE_BINARY_RHS)
392     return fold_build2_loc (loc, code, type, gimple_assign_rhs1 (stmt),
393 			gimple_assign_rhs2 (stmt));
394   else if (get_gimple_rhs_class (code) == GIMPLE_UNARY_RHS)
395     return build1 (code, type, gimple_assign_rhs1 (stmt));
396   else if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS)
397     return gimple_assign_rhs1 (stmt);
398   else
399     gcc_unreachable ();
400 }
401 
402 /* Combine OP0 CODE OP1 in the context of a COND_EXPR.  Returns
403    the folded result in a form suitable for COND_EXPR_COND or
404    NULL_TREE, if there is no suitable simplified form.  If
405    INVARIANT_ONLY is true only gimple_min_invariant results are
406    considered simplified.  */
407 
408 static tree
409 combine_cond_expr_cond (gimple stmt, enum tree_code code, tree type,
410 			tree op0, tree op1, bool invariant_only)
411 {
412   tree t;
413 
414   gcc_assert (TREE_CODE_CLASS (code) == tcc_comparison);
415 
416   fold_defer_overflow_warnings ();
417   t = fold_binary_loc (gimple_location (stmt), code, type, op0, op1);
418   if (!t)
419     {
420       fold_undefer_overflow_warnings (false, NULL, 0);
421       return NULL_TREE;
422     }
423 
424   /* Require that we got a boolean type out if we put one in.  */
425   gcc_assert (TREE_CODE (TREE_TYPE (t)) == TREE_CODE (type));
426 
427   /* Canonicalize the combined condition for use in a COND_EXPR.  */
428   t = canonicalize_cond_expr_cond (t);
429 
430   /* Bail out if we required an invariant but didn't get one.  */
431   if (!t || (invariant_only && !is_gimple_min_invariant (t)))
432     {
433       fold_undefer_overflow_warnings (false, NULL, 0);
434       return NULL_TREE;
435     }
436 
437   fold_undefer_overflow_warnings (!gimple_no_warning_p (stmt), stmt, 0);
438 
439   return t;
440 }
441 
442 /* Combine the comparison OP0 CODE OP1 at LOC with the defining statements
443    of its operand.  Return a new comparison tree or NULL_TREE if there
444    were no simplifying combines.  */
445 
446 static tree
447 forward_propagate_into_comparison_1 (gimple stmt,
448 				     enum tree_code code, tree type,
449 				     tree op0, tree op1)
450 {
451   tree tmp = NULL_TREE;
452   tree rhs0 = NULL_TREE, rhs1 = NULL_TREE;
453   bool single_use0_p = false, single_use1_p = false;
454 
455   /* For comparisons use the first operand, that is likely to
456      simplify comparisons against constants.  */
457   if (TREE_CODE (op0) == SSA_NAME)
458     {
459       gimple def_stmt = get_prop_source_stmt (op0, false, &single_use0_p);
460       if (def_stmt && can_propagate_from (def_stmt))
461 	{
462 	  enum tree_code def_code = gimple_assign_rhs_code (def_stmt);
463 	  bool invariant_only_p = !single_use0_p;
464 
465 	  rhs0 = rhs_to_tree (TREE_TYPE (op1), def_stmt);
466 
467 	  /* Always combine comparisons or conversions from booleans.  */
468 	  if (TREE_CODE (op1) == INTEGER_CST
469 	      && ((CONVERT_EXPR_CODE_P (def_code)
470 		   && TREE_CODE (TREE_TYPE (TREE_OPERAND (rhs0, 0)))
471 		      == BOOLEAN_TYPE)
472 		  || TREE_CODE_CLASS (def_code) == tcc_comparison))
473 	    invariant_only_p = false;
474 
475 	  tmp = combine_cond_expr_cond (stmt, code, type,
476 					rhs0, op1, invariant_only_p);
477 	  if (tmp)
478 	    return tmp;
479 	}
480     }
481 
482   /* If that wasn't successful, try the second operand.  */
483   if (TREE_CODE (op1) == SSA_NAME)
484     {
485       gimple def_stmt = get_prop_source_stmt (op1, false, &single_use1_p);
486       if (def_stmt && can_propagate_from (def_stmt))
487 	{
488 	  rhs1 = rhs_to_tree (TREE_TYPE (op0), def_stmt);
489 	  tmp = combine_cond_expr_cond (stmt, code, type,
490 					op0, rhs1, !single_use1_p);
491 	  if (tmp)
492 	    return tmp;
493 	}
494     }
495 
496   /* If that wasn't successful either, try both operands.  */
497   if (rhs0 != NULL_TREE
498       && rhs1 != NULL_TREE)
499     tmp = combine_cond_expr_cond (stmt, code, type,
500 				  rhs0, rhs1,
501 				  !(single_use0_p && single_use1_p));
502 
503   return tmp;
504 }
505 
506 /* Propagate from the ssa name definition statements of the assignment
507    from a comparison at *GSI into the conditional if that simplifies it.
508    Returns 1 if the stmt was modified and 2 if the CFG needs cleanup,
509    otherwise returns 0.  */
510 
511 static int
512 forward_propagate_into_comparison (gimple_stmt_iterator *gsi)
513 {
514   gimple stmt = gsi_stmt (*gsi);
515   tree tmp;
516   bool cfg_changed = false;
517   tree type = TREE_TYPE (gimple_assign_lhs (stmt));
518   tree rhs1 = gimple_assign_rhs1 (stmt);
519   tree rhs2 = gimple_assign_rhs2 (stmt);
520 
521   /* Combine the comparison with defining statements.  */
522   tmp = forward_propagate_into_comparison_1 (stmt,
523 					     gimple_assign_rhs_code (stmt),
524 					     type, rhs1, rhs2);
525   if (tmp && useless_type_conversion_p (type, TREE_TYPE (tmp)))
526     {
527       gimple_assign_set_rhs_from_tree (gsi, tmp);
528       fold_stmt (gsi);
529       update_stmt (gsi_stmt (*gsi));
530 
531       if (TREE_CODE (rhs1) == SSA_NAME)
532 	cfg_changed |= remove_prop_source_from_use (rhs1);
533       if (TREE_CODE (rhs2) == SSA_NAME)
534 	cfg_changed |= remove_prop_source_from_use (rhs2);
535       return cfg_changed ? 2 : 1;
536     }
537 
538   return 0;
539 }
540 
541 /* Propagate from the ssa name definition statements of COND_EXPR
542    in GIMPLE_COND statement STMT into the conditional if that simplifies it.
543    Returns zero if no statement was changed, one if there were
544    changes and two if cfg_cleanup needs to run.
545 
546    This must be kept in sync with forward_propagate_into_cond.  */
547 
548 static int
549 forward_propagate_into_gimple_cond (gcond *stmt)
550 {
551   tree tmp;
552   enum tree_code code = gimple_cond_code (stmt);
553   bool cfg_changed = false;
554   tree rhs1 = gimple_cond_lhs (stmt);
555   tree rhs2 = gimple_cond_rhs (stmt);
556 
557   /* We can do tree combining on SSA_NAME and comparison expressions.  */
558   if (TREE_CODE_CLASS (gimple_cond_code (stmt)) != tcc_comparison)
559     return 0;
560 
561   tmp = forward_propagate_into_comparison_1 (stmt, code,
562 					     boolean_type_node,
563 					     rhs1, rhs2);
564   if (tmp)
565     {
566       if (dump_file && tmp)
567 	{
568 	  fprintf (dump_file, "  Replaced '");
569 	  print_gimple_expr (dump_file, stmt, 0, 0);
570 	  fprintf (dump_file, "' with '");
571 	  print_generic_expr (dump_file, tmp, 0);
572 	  fprintf (dump_file, "'\n");
573 	}
574 
575       gimple_cond_set_condition_from_tree (stmt, unshare_expr (tmp));
576       update_stmt (stmt);
577 
578       if (TREE_CODE (rhs1) == SSA_NAME)
579 	cfg_changed |= remove_prop_source_from_use (rhs1);
580       if (TREE_CODE (rhs2) == SSA_NAME)
581 	cfg_changed |= remove_prop_source_from_use (rhs2);
582       return (cfg_changed || is_gimple_min_invariant (tmp)) ? 2 : 1;
583     }
584 
585   /* Canonicalize _Bool == 0 and _Bool != 1 to _Bool != 0 by swapping edges.  */
586   if ((TREE_CODE (TREE_TYPE (rhs1)) == BOOLEAN_TYPE
587        || (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
588 	   && TYPE_PRECISION (TREE_TYPE (rhs1)) == 1))
589       && ((code == EQ_EXPR
590 	   && integer_zerop (rhs2))
591 	  || (code == NE_EXPR
592 	      && integer_onep (rhs2))))
593     {
594       basic_block bb = gimple_bb (stmt);
595       gimple_cond_set_code (stmt, NE_EXPR);
596       gimple_cond_set_rhs (stmt, build_zero_cst (TREE_TYPE (rhs1)));
597       EDGE_SUCC (bb, 0)->flags ^= (EDGE_TRUE_VALUE|EDGE_FALSE_VALUE);
598       EDGE_SUCC (bb, 1)->flags ^= (EDGE_TRUE_VALUE|EDGE_FALSE_VALUE);
599       return 1;
600     }
601 
602   return 0;
603 }
604 
605 
606 /* Propagate from the ssa name definition statements of COND_EXPR
607    in the rhs of statement STMT into the conditional if that simplifies it.
608    Returns true zero if the stmt was changed.  */
609 
610 static bool
611 forward_propagate_into_cond (gimple_stmt_iterator *gsi_p)
612 {
613   gimple stmt = gsi_stmt (*gsi_p);
614   tree tmp = NULL_TREE;
615   tree cond = gimple_assign_rhs1 (stmt);
616   enum tree_code code = gimple_assign_rhs_code (stmt);
617 
618   /* We can do tree combining on SSA_NAME and comparison expressions.  */
619   if (COMPARISON_CLASS_P (cond))
620     tmp = forward_propagate_into_comparison_1 (stmt, TREE_CODE (cond),
621 					       TREE_TYPE (cond),
622 					       TREE_OPERAND (cond, 0),
623 					       TREE_OPERAND (cond, 1));
624   else if (TREE_CODE (cond) == SSA_NAME)
625     {
626       enum tree_code def_code;
627       tree name = cond;
628       gimple def_stmt = get_prop_source_stmt (name, true, NULL);
629       if (!def_stmt || !can_propagate_from (def_stmt))
630 	return 0;
631 
632       def_code = gimple_assign_rhs_code (def_stmt);
633       if (TREE_CODE_CLASS (def_code) == tcc_comparison)
634 	tmp = fold_build2_loc (gimple_location (def_stmt),
635 			       def_code,
636 			       TREE_TYPE (cond),
637 			       gimple_assign_rhs1 (def_stmt),
638 			       gimple_assign_rhs2 (def_stmt));
639     }
640 
641   if (tmp
642       && is_gimple_condexpr (tmp))
643     {
644       if (dump_file && tmp)
645 	{
646 	  fprintf (dump_file, "  Replaced '");
647 	  print_generic_expr (dump_file, cond, 0);
648 	  fprintf (dump_file, "' with '");
649 	  print_generic_expr (dump_file, tmp, 0);
650 	  fprintf (dump_file, "'\n");
651 	}
652 
653       if ((code == VEC_COND_EXPR) ? integer_all_onesp (tmp)
654 				  : integer_onep (tmp))
655 	gimple_assign_set_rhs_from_tree (gsi_p, gimple_assign_rhs2 (stmt));
656       else if (integer_zerop (tmp))
657 	gimple_assign_set_rhs_from_tree (gsi_p, gimple_assign_rhs3 (stmt));
658       else
659 	gimple_assign_set_rhs1 (stmt, unshare_expr (tmp));
660       stmt = gsi_stmt (*gsi_p);
661       update_stmt (stmt);
662 
663       return true;
664     }
665 
666   return 0;
667 }
668 
669 /* We've just substituted an ADDR_EXPR into stmt.  Update all the
670    relevant data structures to match.  */
671 
672 static void
673 tidy_after_forward_propagate_addr (gimple stmt)
674 {
675   /* We may have turned a trapping insn into a non-trapping insn.  */
676   if (maybe_clean_or_replace_eh_stmt (stmt, stmt))
677     bitmap_set_bit (to_purge, gimple_bb (stmt)->index);
678 
679   if (TREE_CODE (gimple_assign_rhs1 (stmt)) == ADDR_EXPR)
680      recompute_tree_invariant_for_addr_expr (gimple_assign_rhs1 (stmt));
681 }
682 
683 /* NAME is a SSA_NAME representing DEF_RHS which is of the form
684    ADDR_EXPR <whatever>.
685 
686    Try to forward propagate the ADDR_EXPR into the use USE_STMT.
687    Often this will allow for removal of an ADDR_EXPR and INDIRECT_REF
688    node or for recovery of array indexing from pointer arithmetic.
689 
690    Return true if the propagation was successful (the propagation can
691    be not totally successful, yet things may have been changed).  */
692 
693 static bool
694 forward_propagate_addr_expr_1 (tree name, tree def_rhs,
695 			       gimple_stmt_iterator *use_stmt_gsi,
696 			       bool single_use_p)
697 {
698   tree lhs, rhs, rhs2, array_ref;
699   gimple use_stmt = gsi_stmt (*use_stmt_gsi);
700   enum tree_code rhs_code;
701   bool res = true;
702 
703   gcc_assert (TREE_CODE (def_rhs) == ADDR_EXPR);
704 
705   lhs = gimple_assign_lhs (use_stmt);
706   rhs_code = gimple_assign_rhs_code (use_stmt);
707   rhs = gimple_assign_rhs1 (use_stmt);
708 
709   /* Do not perform copy-propagation but recurse through copy chains.  */
710   if (TREE_CODE (lhs) == SSA_NAME
711       && rhs_code == SSA_NAME)
712     return forward_propagate_addr_expr (lhs, def_rhs, single_use_p);
713 
714   /* The use statement could be a conversion.  Recurse to the uses of the
715      lhs as copyprop does not copy through pointer to integer to pointer
716      conversions and FRE does not catch all cases either.
717      Treat the case of a single-use name and
718      a conversion to def_rhs type separate, though.  */
719   if (TREE_CODE (lhs) == SSA_NAME
720       && CONVERT_EXPR_CODE_P (rhs_code))
721     {
722       /* If there is a point in a conversion chain where the types match
723          so we can remove a conversion re-materialize the address here
724 	 and stop.  */
725       if (single_use_p
726 	  && useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (def_rhs)))
727 	{
728 	  gimple_assign_set_rhs1 (use_stmt, unshare_expr (def_rhs));
729 	  gimple_assign_set_rhs_code (use_stmt, TREE_CODE (def_rhs));
730 	  return true;
731 	}
732 
733       /* Else recurse if the conversion preserves the address value.  */
734       if ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
735 	   || POINTER_TYPE_P (TREE_TYPE (lhs)))
736 	  && (TYPE_PRECISION (TREE_TYPE (lhs))
737 	      >= TYPE_PRECISION (TREE_TYPE (def_rhs))))
738 	return forward_propagate_addr_expr (lhs, def_rhs, single_use_p);
739 
740       return false;
741     }
742 
743   /* If this isn't a conversion chain from this on we only can propagate
744      into compatible pointer contexts.  */
745   if (!types_compatible_p (TREE_TYPE (name), TREE_TYPE (def_rhs)))
746     return false;
747 
748   /* Propagate through constant pointer adjustments.  */
749   if (TREE_CODE (lhs) == SSA_NAME
750       && rhs_code == POINTER_PLUS_EXPR
751       && rhs == name
752       && TREE_CODE (gimple_assign_rhs2 (use_stmt)) == INTEGER_CST)
753     {
754       tree new_def_rhs;
755       /* As we come here with non-invariant addresses in def_rhs we need
756          to make sure we can build a valid constant offsetted address
757 	 for further propagation.  Simply rely on fold building that
758 	 and check after the fact.  */
759       new_def_rhs = fold_build2 (MEM_REF, TREE_TYPE (TREE_TYPE (rhs)),
760 				 def_rhs,
761 				 fold_convert (ptr_type_node,
762 					       gimple_assign_rhs2 (use_stmt)));
763       if (TREE_CODE (new_def_rhs) == MEM_REF
764 	  && !is_gimple_mem_ref_addr (TREE_OPERAND (new_def_rhs, 0)))
765 	return false;
766       new_def_rhs = build_fold_addr_expr_with_type (new_def_rhs,
767 						    TREE_TYPE (rhs));
768 
769       /* Recurse.  If we could propagate into all uses of lhs do not
770 	 bother to replace into the current use but just pretend we did.  */
771       if (TREE_CODE (new_def_rhs) == ADDR_EXPR
772 	  && forward_propagate_addr_expr (lhs, new_def_rhs, single_use_p))
773 	return true;
774 
775       if (useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (new_def_rhs)))
776 	gimple_assign_set_rhs_with_ops (use_stmt_gsi, TREE_CODE (new_def_rhs),
777 					new_def_rhs);
778       else if (is_gimple_min_invariant (new_def_rhs))
779 	gimple_assign_set_rhs_with_ops (use_stmt_gsi, NOP_EXPR, new_def_rhs);
780       else
781 	return false;
782       gcc_assert (gsi_stmt (*use_stmt_gsi) == use_stmt);
783       update_stmt (use_stmt);
784       return true;
785     }
786 
787   /* Now strip away any outer COMPONENT_REF/ARRAY_REF nodes from the LHS.
788      ADDR_EXPR will not appear on the LHS.  */
789   tree *lhsp = gimple_assign_lhs_ptr (use_stmt);
790   while (handled_component_p (*lhsp))
791     lhsp = &TREE_OPERAND (*lhsp, 0);
792   lhs = *lhsp;
793 
794   /* Now see if the LHS node is a MEM_REF using NAME.  If so,
795      propagate the ADDR_EXPR into the use of NAME and fold the result.  */
796   if (TREE_CODE (lhs) == MEM_REF
797       && TREE_OPERAND (lhs, 0) == name)
798     {
799       tree def_rhs_base;
800       HOST_WIDE_INT def_rhs_offset;
801       /* If the address is invariant we can always fold it.  */
802       if ((def_rhs_base = get_addr_base_and_unit_offset (TREE_OPERAND (def_rhs, 0),
803 							 &def_rhs_offset)))
804 	{
805 	  offset_int off = mem_ref_offset (lhs);
806 	  tree new_ptr;
807 	  off += def_rhs_offset;
808 	  if (TREE_CODE (def_rhs_base) == MEM_REF)
809 	    {
810 	      off += mem_ref_offset (def_rhs_base);
811 	      new_ptr = TREE_OPERAND (def_rhs_base, 0);
812 	    }
813 	  else
814 	    new_ptr = build_fold_addr_expr (def_rhs_base);
815 	  TREE_OPERAND (lhs, 0) = new_ptr;
816 	  TREE_OPERAND (lhs, 1)
817 	    = wide_int_to_tree (TREE_TYPE (TREE_OPERAND (lhs, 1)), off);
818 	  tidy_after_forward_propagate_addr (use_stmt);
819 	  /* Continue propagating into the RHS if this was not the only use.  */
820 	  if (single_use_p)
821 	    return true;
822 	}
823       /* If the LHS is a plain dereference and the value type is the same as
824          that of the pointed-to type of the address we can put the
825 	 dereferenced address on the LHS preserving the original alias-type.  */
826       else if (integer_zerop (TREE_OPERAND (lhs, 1))
827 	       && ((gimple_assign_lhs (use_stmt) == lhs
828 		    && useless_type_conversion_p
829 		         (TREE_TYPE (TREE_OPERAND (def_rhs, 0)),
830 		          TREE_TYPE (gimple_assign_rhs1 (use_stmt))))
831 		   || types_compatible_p (TREE_TYPE (lhs),
832 					  TREE_TYPE (TREE_OPERAND (def_rhs, 0))))
833 	       /* Don't forward anything into clobber stmts if it would result
834 		  in the lhs no longer being a MEM_REF.  */
835 	       && (!gimple_clobber_p (use_stmt)
836 		   || TREE_CODE (TREE_OPERAND (def_rhs, 0)) == MEM_REF))
837 	{
838 	  tree *def_rhs_basep = &TREE_OPERAND (def_rhs, 0);
839 	  tree new_offset, new_base, saved, new_lhs;
840 	  while (handled_component_p (*def_rhs_basep))
841 	    def_rhs_basep = &TREE_OPERAND (*def_rhs_basep, 0);
842 	  saved = *def_rhs_basep;
843 	  if (TREE_CODE (*def_rhs_basep) == MEM_REF)
844 	    {
845 	      new_base = TREE_OPERAND (*def_rhs_basep, 0);
846 	      new_offset = fold_convert (TREE_TYPE (TREE_OPERAND (lhs, 1)),
847 					 TREE_OPERAND (*def_rhs_basep, 1));
848 	    }
849 	  else
850 	    {
851 	      new_base = build_fold_addr_expr (*def_rhs_basep);
852 	      new_offset = TREE_OPERAND (lhs, 1);
853 	    }
854 	  *def_rhs_basep = build2 (MEM_REF, TREE_TYPE (*def_rhs_basep),
855 				   new_base, new_offset);
856 	  TREE_THIS_VOLATILE (*def_rhs_basep) = TREE_THIS_VOLATILE (lhs);
857 	  TREE_SIDE_EFFECTS (*def_rhs_basep) = TREE_SIDE_EFFECTS (lhs);
858 	  TREE_THIS_NOTRAP (*def_rhs_basep) = TREE_THIS_NOTRAP (lhs);
859 	  new_lhs = unshare_expr (TREE_OPERAND (def_rhs, 0));
860 	  *lhsp = new_lhs;
861 	  TREE_THIS_VOLATILE (new_lhs) = TREE_THIS_VOLATILE (lhs);
862 	  TREE_SIDE_EFFECTS (new_lhs) = TREE_SIDE_EFFECTS (lhs);
863 	  *def_rhs_basep = saved;
864 	  tidy_after_forward_propagate_addr (use_stmt);
865 	  /* Continue propagating into the RHS if this was not the
866 	     only use.  */
867 	  if (single_use_p)
868 	    return true;
869 	}
870       else
871 	/* We can have a struct assignment dereferencing our name twice.
872 	   Note that we didn't propagate into the lhs to not falsely
873 	   claim we did when propagating into the rhs.  */
874 	res = false;
875     }
876 
877   /* Strip away any outer COMPONENT_REF, ARRAY_REF or ADDR_EXPR
878      nodes from the RHS.  */
879   tree *rhsp = gimple_assign_rhs1_ptr (use_stmt);
880   if (TREE_CODE (*rhsp) == ADDR_EXPR)
881     rhsp = &TREE_OPERAND (*rhsp, 0);
882   while (handled_component_p (*rhsp))
883     rhsp = &TREE_OPERAND (*rhsp, 0);
884   rhs = *rhsp;
885 
886   /* Now see if the RHS node is a MEM_REF using NAME.  If so,
887      propagate the ADDR_EXPR into the use of NAME and fold the result.  */
888   if (TREE_CODE (rhs) == MEM_REF
889       && TREE_OPERAND (rhs, 0) == name)
890     {
891       tree def_rhs_base;
892       HOST_WIDE_INT def_rhs_offset;
893       if ((def_rhs_base = get_addr_base_and_unit_offset (TREE_OPERAND (def_rhs, 0),
894 							 &def_rhs_offset)))
895 	{
896 	  offset_int off = mem_ref_offset (rhs);
897 	  tree new_ptr;
898 	  off += def_rhs_offset;
899 	  if (TREE_CODE (def_rhs_base) == MEM_REF)
900 	    {
901 	      off += mem_ref_offset (def_rhs_base);
902 	      new_ptr = TREE_OPERAND (def_rhs_base, 0);
903 	    }
904 	  else
905 	    new_ptr = build_fold_addr_expr (def_rhs_base);
906 	  TREE_OPERAND (rhs, 0) = new_ptr;
907 	  TREE_OPERAND (rhs, 1)
908 	    = wide_int_to_tree (TREE_TYPE (TREE_OPERAND (rhs, 1)), off);
909 	  fold_stmt_inplace (use_stmt_gsi);
910 	  tidy_after_forward_propagate_addr (use_stmt);
911 	  return res;
912 	}
913       /* If the RHS is a plain dereference and the value type is the same as
914          that of the pointed-to type of the address we can put the
915 	 dereferenced address on the RHS preserving the original alias-type.  */
916       else if (integer_zerop (TREE_OPERAND (rhs, 1))
917 	       && ((gimple_assign_rhs1 (use_stmt) == rhs
918 		    && useless_type_conversion_p
919 		         (TREE_TYPE (gimple_assign_lhs (use_stmt)),
920 		          TREE_TYPE (TREE_OPERAND (def_rhs, 0))))
921 		   || types_compatible_p (TREE_TYPE (rhs),
922 					  TREE_TYPE (TREE_OPERAND (def_rhs, 0)))))
923 	{
924 	  tree *def_rhs_basep = &TREE_OPERAND (def_rhs, 0);
925 	  tree new_offset, new_base, saved, new_rhs;
926 	  while (handled_component_p (*def_rhs_basep))
927 	    def_rhs_basep = &TREE_OPERAND (*def_rhs_basep, 0);
928 	  saved = *def_rhs_basep;
929 	  if (TREE_CODE (*def_rhs_basep) == MEM_REF)
930 	    {
931 	      new_base = TREE_OPERAND (*def_rhs_basep, 0);
932 	      new_offset = fold_convert (TREE_TYPE (TREE_OPERAND (rhs, 1)),
933 					 TREE_OPERAND (*def_rhs_basep, 1));
934 	    }
935 	  else
936 	    {
937 	      new_base = build_fold_addr_expr (*def_rhs_basep);
938 	      new_offset = TREE_OPERAND (rhs, 1);
939 	    }
940 	  *def_rhs_basep = build2 (MEM_REF, TREE_TYPE (*def_rhs_basep),
941 				   new_base, new_offset);
942 	  TREE_THIS_VOLATILE (*def_rhs_basep) = TREE_THIS_VOLATILE (rhs);
943 	  TREE_SIDE_EFFECTS (*def_rhs_basep) = TREE_SIDE_EFFECTS (rhs);
944 	  TREE_THIS_NOTRAP (*def_rhs_basep) = TREE_THIS_NOTRAP (rhs);
945 	  new_rhs = unshare_expr (TREE_OPERAND (def_rhs, 0));
946 	  *rhsp = new_rhs;
947 	  TREE_THIS_VOLATILE (new_rhs) = TREE_THIS_VOLATILE (rhs);
948 	  TREE_SIDE_EFFECTS (new_rhs) = TREE_SIDE_EFFECTS (rhs);
949 	  *def_rhs_basep = saved;
950 	  fold_stmt_inplace (use_stmt_gsi);
951 	  tidy_after_forward_propagate_addr (use_stmt);
952 	  return res;
953 	}
954     }
955 
956   /* If the use of the ADDR_EXPR is not a POINTER_PLUS_EXPR, there
957      is nothing to do. */
958   if (gimple_assign_rhs_code (use_stmt) != POINTER_PLUS_EXPR
959       || gimple_assign_rhs1 (use_stmt) != name)
960     return false;
961 
962   /* The remaining cases are all for turning pointer arithmetic into
963      array indexing.  They only apply when we have the address of
964      element zero in an array.  If that is not the case then there
965      is nothing to do.  */
966   array_ref = TREE_OPERAND (def_rhs, 0);
967   if ((TREE_CODE (array_ref) != ARRAY_REF
968        || TREE_CODE (TREE_TYPE (TREE_OPERAND (array_ref, 0))) != ARRAY_TYPE
969        || TREE_CODE (TREE_OPERAND (array_ref, 1)) != INTEGER_CST)
970       && TREE_CODE (TREE_TYPE (array_ref)) != ARRAY_TYPE)
971     return false;
972 
973   rhs2 = gimple_assign_rhs2 (use_stmt);
974   /* Optimize &x[C1] p+ C2 to  &x p+ C3 with C3 = C1 * element_size + C2.  */
975   if (TREE_CODE (rhs2) == INTEGER_CST)
976     {
977       tree new_rhs = build1_loc (gimple_location (use_stmt),
978 				 ADDR_EXPR, TREE_TYPE (def_rhs),
979 				 fold_build2 (MEM_REF,
980 					      TREE_TYPE (TREE_TYPE (def_rhs)),
981 					      unshare_expr (def_rhs),
982 					      fold_convert (ptr_type_node,
983 							    rhs2)));
984       gimple_assign_set_rhs_from_tree (use_stmt_gsi, new_rhs);
985       use_stmt = gsi_stmt (*use_stmt_gsi);
986       update_stmt (use_stmt);
987       tidy_after_forward_propagate_addr (use_stmt);
988       return true;
989     }
990 
991   return false;
992 }
993 
994 /* STMT is a statement of the form SSA_NAME = ADDR_EXPR <whatever>.
995 
996    Try to forward propagate the ADDR_EXPR into all uses of the SSA_NAME.
997    Often this will allow for removal of an ADDR_EXPR and INDIRECT_REF
998    node or for recovery of array indexing from pointer arithmetic.
999 
1000    PARENT_SINGLE_USE_P tells if, when in a recursive invocation, NAME was
1001    the single use in the previous invocation.  Pass true when calling
1002    this as toplevel.
1003 
1004    Returns true, if all uses have been propagated into.  */
1005 
1006 static bool
1007 forward_propagate_addr_expr (tree name, tree rhs, bool parent_single_use_p)
1008 {
1009   imm_use_iterator iter;
1010   gimple use_stmt;
1011   bool all = true;
1012   bool single_use_p = parent_single_use_p && has_single_use (name);
1013 
1014   FOR_EACH_IMM_USE_STMT (use_stmt, iter, name)
1015     {
1016       bool result;
1017       tree use_rhs;
1018 
1019       /* If the use is not in a simple assignment statement, then
1020 	 there is nothing we can do.  */
1021       if (!is_gimple_assign (use_stmt))
1022 	{
1023 	  if (!is_gimple_debug (use_stmt))
1024 	    all = false;
1025 	  continue;
1026 	}
1027 
1028       gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt);
1029       result = forward_propagate_addr_expr_1 (name, rhs, &gsi,
1030 					      single_use_p);
1031       /* If the use has moved to a different statement adjust
1032 	 the update machinery for the old statement too.  */
1033       if (use_stmt != gsi_stmt (gsi))
1034 	{
1035 	  update_stmt (use_stmt);
1036 	  use_stmt = gsi_stmt (gsi);
1037 	}
1038       update_stmt (use_stmt);
1039       all &= result;
1040 
1041       /* Remove intermediate now unused copy and conversion chains.  */
1042       use_rhs = gimple_assign_rhs1 (use_stmt);
1043       if (result
1044 	  && TREE_CODE (gimple_assign_lhs (use_stmt)) == SSA_NAME
1045 	  && TREE_CODE (use_rhs) == SSA_NAME
1046 	  && has_zero_uses (gimple_assign_lhs (use_stmt)))
1047 	{
1048 	  gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt);
1049 	  fwprop_invalidate_lattice (gimple_get_lhs (use_stmt));
1050 	  release_defs (use_stmt);
1051 	  gsi_remove (&gsi, true);
1052 	}
1053     }
1054 
1055   return all && has_zero_uses (name);
1056 }
1057 
1058 
1059 /* Helper function for simplify_gimple_switch.  Remove case labels that
1060    have values outside the range of the new type.  */
1061 
1062 static void
1063 simplify_gimple_switch_label_vec (gswitch *stmt, tree index_type)
1064 {
1065   unsigned int branch_num = gimple_switch_num_labels (stmt);
1066   auto_vec<tree> labels (branch_num);
1067   unsigned int i, len;
1068 
1069   /* Collect the existing case labels in a VEC, and preprocess it as if
1070      we are gimplifying a GENERIC SWITCH_EXPR.  */
1071   for (i = 1; i < branch_num; i++)
1072     labels.quick_push (gimple_switch_label (stmt, i));
1073   preprocess_case_label_vec_for_gimple (labels, index_type, NULL);
1074 
1075   /* If any labels were removed, replace the existing case labels
1076      in the GIMPLE_SWITCH statement with the correct ones.
1077      Note that the type updates were done in-place on the case labels,
1078      so we only have to replace the case labels in the GIMPLE_SWITCH
1079      if the number of labels changed.  */
1080   len = labels.length ();
1081   if (len < branch_num - 1)
1082     {
1083       bitmap target_blocks;
1084       edge_iterator ei;
1085       edge e;
1086 
1087       /* Corner case: *all* case labels have been removed as being
1088 	 out-of-range for INDEX_TYPE.  Push one label and let the
1089 	 CFG cleanups deal with this further.  */
1090       if (len == 0)
1091 	{
1092 	  tree label, elt;
1093 
1094 	  label = CASE_LABEL (gimple_switch_default_label (stmt));
1095 	  elt = build_case_label (build_int_cst (index_type, 0), NULL, label);
1096 	  labels.quick_push (elt);
1097 	  len = 1;
1098 	}
1099 
1100       for (i = 0; i < labels.length (); i++)
1101 	gimple_switch_set_label (stmt, i + 1, labels[i]);
1102       for (i++ ; i < branch_num; i++)
1103 	gimple_switch_set_label (stmt, i, NULL_TREE);
1104       gimple_switch_set_num_labels (stmt, len + 1);
1105 
1106       /* Cleanup any edges that are now dead.  */
1107       target_blocks = BITMAP_ALLOC (NULL);
1108       for (i = 0; i < gimple_switch_num_labels (stmt); i++)
1109 	{
1110 	  tree elt = gimple_switch_label (stmt, i);
1111 	  basic_block target = label_to_block (CASE_LABEL (elt));
1112 	  bitmap_set_bit (target_blocks, target->index);
1113 	}
1114       for (ei = ei_start (gimple_bb (stmt)->succs); (e = ei_safe_edge (ei)); )
1115 	{
1116 	  if (! bitmap_bit_p (target_blocks, e->dest->index))
1117 	    {
1118 	      remove_edge (e);
1119 	      cfg_changed = true;
1120 	      free_dominance_info (CDI_DOMINATORS);
1121 	    }
1122 	  else
1123 	    ei_next (&ei);
1124 	}
1125       BITMAP_FREE (target_blocks);
1126     }
1127 }
1128 
1129 /* STMT is a SWITCH_EXPR for which we attempt to find equivalent forms of
1130    the condition which we may be able to optimize better.  */
1131 
1132 static bool
1133 simplify_gimple_switch (gswitch *stmt)
1134 {
1135   /* The optimization that we really care about is removing unnecessary
1136      casts.  That will let us do much better in propagating the inferred
1137      constant at the switch target.  */
1138   tree cond = gimple_switch_index (stmt);
1139   if (TREE_CODE (cond) == SSA_NAME)
1140     {
1141       gimple def_stmt = SSA_NAME_DEF_STMT (cond);
1142       if (gimple_assign_cast_p (def_stmt))
1143 	{
1144 	  tree def = gimple_assign_rhs1 (def_stmt);
1145 	  if (TREE_CODE (def) != SSA_NAME)
1146 	    return false;
1147 
1148 	  /* If we have an extension or sign-change that preserves the
1149 	     values we check against then we can copy the source value into
1150 	     the switch.  */
1151 	  tree ti = TREE_TYPE (def);
1152 	  if (INTEGRAL_TYPE_P (ti)
1153 	      && TYPE_PRECISION (ti) <= TYPE_PRECISION (TREE_TYPE (cond)))
1154 	    {
1155 	      size_t n = gimple_switch_num_labels (stmt);
1156 	      tree min = NULL_TREE, max = NULL_TREE;
1157 	      if (n > 1)
1158 		{
1159 		  min = CASE_LOW (gimple_switch_label (stmt, 1));
1160 		  if (CASE_HIGH (gimple_switch_label (stmt, n - 1)))
1161 		    max = CASE_HIGH (gimple_switch_label (stmt, n - 1));
1162 		  else
1163 		    max = CASE_LOW (gimple_switch_label (stmt, n - 1));
1164 		}
1165 	      if ((!min || int_fits_type_p (min, ti))
1166 		  && (!max || int_fits_type_p (max, ti)))
1167 		{
1168 		  gimple_switch_set_index (stmt, def);
1169 		  simplify_gimple_switch_label_vec (stmt, ti);
1170 		  update_stmt (stmt);
1171 		  return true;
1172 		}
1173 	    }
1174 	}
1175     }
1176 
1177   return false;
1178 }
1179 
1180 /* For pointers p2 and p1 return p2 - p1 if the
1181    difference is known and constant, otherwise return NULL.  */
1182 
1183 static tree
1184 constant_pointer_difference (tree p1, tree p2)
1185 {
1186   int i, j;
1187 #define CPD_ITERATIONS 5
1188   tree exps[2][CPD_ITERATIONS];
1189   tree offs[2][CPD_ITERATIONS];
1190   int cnt[2];
1191 
1192   for (i = 0; i < 2; i++)
1193     {
1194       tree p = i ? p1 : p2;
1195       tree off = size_zero_node;
1196       gimple stmt;
1197       enum tree_code code;
1198 
1199       /* For each of p1 and p2 we need to iterate at least
1200 	 twice, to handle ADDR_EXPR directly in p1/p2,
1201 	 SSA_NAME with ADDR_EXPR or POINTER_PLUS_EXPR etc.
1202 	 on definition's stmt RHS.  Iterate a few extra times.  */
1203       j = 0;
1204       do
1205 	{
1206 	  if (!POINTER_TYPE_P (TREE_TYPE (p)))
1207 	    break;
1208 	  if (TREE_CODE (p) == ADDR_EXPR)
1209 	    {
1210 	      tree q = TREE_OPERAND (p, 0);
1211 	      HOST_WIDE_INT offset;
1212 	      tree base = get_addr_base_and_unit_offset (q, &offset);
1213 	      if (base)
1214 		{
1215 		  q = base;
1216 		  if (offset)
1217 		    off = size_binop (PLUS_EXPR, off, size_int (offset));
1218 		}
1219 	      if (TREE_CODE (q) == MEM_REF
1220 		  && TREE_CODE (TREE_OPERAND (q, 0)) == SSA_NAME)
1221 		{
1222 		  p = TREE_OPERAND (q, 0);
1223 		  off = size_binop (PLUS_EXPR, off,
1224 				    wide_int_to_tree (sizetype,
1225 						      mem_ref_offset (q)));
1226 		}
1227 	      else
1228 		{
1229 		  exps[i][j] = q;
1230 		  offs[i][j++] = off;
1231 		  break;
1232 		}
1233 	    }
1234 	  if (TREE_CODE (p) != SSA_NAME)
1235 	    break;
1236 	  exps[i][j] = p;
1237 	  offs[i][j++] = off;
1238 	  if (j == CPD_ITERATIONS)
1239 	    break;
1240 	  stmt = SSA_NAME_DEF_STMT (p);
1241 	  if (!is_gimple_assign (stmt) || gimple_assign_lhs (stmt) != p)
1242 	    break;
1243 	  code = gimple_assign_rhs_code (stmt);
1244 	  if (code == POINTER_PLUS_EXPR)
1245 	    {
1246 	      if (TREE_CODE (gimple_assign_rhs2 (stmt)) != INTEGER_CST)
1247 		break;
1248 	      off = size_binop (PLUS_EXPR, off, gimple_assign_rhs2 (stmt));
1249 	      p = gimple_assign_rhs1 (stmt);
1250 	    }
1251 	  else if (code == ADDR_EXPR || CONVERT_EXPR_CODE_P (code))
1252 	    p = gimple_assign_rhs1 (stmt);
1253 	  else
1254 	    break;
1255 	}
1256       while (1);
1257       cnt[i] = j;
1258     }
1259 
1260   for (i = 0; i < cnt[0]; i++)
1261     for (j = 0; j < cnt[1]; j++)
1262       if (exps[0][i] == exps[1][j])
1263 	return size_binop (MINUS_EXPR, offs[0][i], offs[1][j]);
1264 
1265   return NULL_TREE;
1266 }
1267 
1268 /* *GSI_P is a GIMPLE_CALL to a builtin function.
1269    Optimize
1270    memcpy (p, "abcd", 4);
1271    memset (p + 4, ' ', 3);
1272    into
1273    memcpy (p, "abcd   ", 7);
1274    call if the latter can be stored by pieces during expansion.  */
1275 
1276 static bool
1277 simplify_builtin_call (gimple_stmt_iterator *gsi_p, tree callee2)
1278 {
1279   gimple stmt1, stmt2 = gsi_stmt (*gsi_p);
1280   tree vuse = gimple_vuse (stmt2);
1281   if (vuse == NULL)
1282     return false;
1283   stmt1 = SSA_NAME_DEF_STMT (vuse);
1284 
1285   switch (DECL_FUNCTION_CODE (callee2))
1286     {
1287     case BUILT_IN_MEMSET:
1288       if (gimple_call_num_args (stmt2) != 3
1289 	  || gimple_call_lhs (stmt2)
1290 	  || CHAR_BIT != 8
1291 	  || BITS_PER_UNIT != 8)
1292 	break;
1293       else
1294 	{
1295 	  tree callee1;
1296 	  tree ptr1, src1, str1, off1, len1, lhs1;
1297 	  tree ptr2 = gimple_call_arg (stmt2, 0);
1298 	  tree val2 = gimple_call_arg (stmt2, 1);
1299 	  tree len2 = gimple_call_arg (stmt2, 2);
1300 	  tree diff, vdef, new_str_cst;
1301 	  gimple use_stmt;
1302 	  unsigned int ptr1_align;
1303 	  unsigned HOST_WIDE_INT src_len;
1304 	  char *src_buf;
1305 	  use_operand_p use_p;
1306 
1307 	  if (!tree_fits_shwi_p (val2)
1308 	      || !tree_fits_uhwi_p (len2)
1309 	      || compare_tree_int (len2, 1024) == 1)
1310 	    break;
1311 	  if (is_gimple_call (stmt1))
1312 	    {
1313 	      /* If first stmt is a call, it needs to be memcpy
1314 		 or mempcpy, with string literal as second argument and
1315 		 constant length.  */
1316 	      callee1 = gimple_call_fndecl (stmt1);
1317 	      if (callee1 == NULL_TREE
1318 		  || DECL_BUILT_IN_CLASS (callee1) != BUILT_IN_NORMAL
1319 		  || gimple_call_num_args (stmt1) != 3)
1320 		break;
1321 	      if (DECL_FUNCTION_CODE (callee1) != BUILT_IN_MEMCPY
1322 		  && DECL_FUNCTION_CODE (callee1) != BUILT_IN_MEMPCPY)
1323 		break;
1324 	      ptr1 = gimple_call_arg (stmt1, 0);
1325 	      src1 = gimple_call_arg (stmt1, 1);
1326 	      len1 = gimple_call_arg (stmt1, 2);
1327 	      lhs1 = gimple_call_lhs (stmt1);
1328 	      if (!tree_fits_uhwi_p (len1))
1329 		break;
1330 	      str1 = string_constant (src1, &off1);
1331 	      if (str1 == NULL_TREE)
1332 		break;
1333 	      if (!tree_fits_uhwi_p (off1)
1334 		  || compare_tree_int (off1, TREE_STRING_LENGTH (str1) - 1) > 0
1335 		  || compare_tree_int (len1, TREE_STRING_LENGTH (str1)
1336 					     - tree_to_uhwi (off1)) > 0
1337 		  || TREE_CODE (TREE_TYPE (str1)) != ARRAY_TYPE
1338 		  || TYPE_MODE (TREE_TYPE (TREE_TYPE (str1)))
1339 		     != TYPE_MODE (char_type_node))
1340 		break;
1341 	    }
1342 	  else if (gimple_assign_single_p (stmt1))
1343 	    {
1344 	      /* Otherwise look for length 1 memcpy optimized into
1345 		 assignment.  */
1346     	      ptr1 = gimple_assign_lhs (stmt1);
1347 	      src1 = gimple_assign_rhs1 (stmt1);
1348 	      if (TREE_CODE (ptr1) != MEM_REF
1349 		  || TYPE_MODE (TREE_TYPE (ptr1)) != TYPE_MODE (char_type_node)
1350 		  || !tree_fits_shwi_p (src1))
1351 		break;
1352 	      ptr1 = build_fold_addr_expr (ptr1);
1353 	      callee1 = NULL_TREE;
1354 	      len1 = size_one_node;
1355 	      lhs1 = NULL_TREE;
1356 	      off1 = size_zero_node;
1357 	      str1 = NULL_TREE;
1358 	    }
1359 	  else
1360 	    break;
1361 
1362 	  diff = constant_pointer_difference (ptr1, ptr2);
1363 	  if (diff == NULL && lhs1 != NULL)
1364 	    {
1365 	      diff = constant_pointer_difference (lhs1, ptr2);
1366 	      if (DECL_FUNCTION_CODE (callee1) == BUILT_IN_MEMPCPY
1367 		  && diff != NULL)
1368 		diff = size_binop (PLUS_EXPR, diff,
1369 				   fold_convert (sizetype, len1));
1370 	    }
1371 	  /* If the difference between the second and first destination pointer
1372 	     is not constant, or is bigger than memcpy length, bail out.  */
1373 	  if (diff == NULL
1374 	      || !tree_fits_uhwi_p (diff)
1375 	      || tree_int_cst_lt (len1, diff)
1376 	      || compare_tree_int (diff, 1024) == 1)
1377 	    break;
1378 
1379 	  /* Use maximum of difference plus memset length and memcpy length
1380 	     as the new memcpy length, if it is too big, bail out.  */
1381 	  src_len = tree_to_uhwi (diff);
1382 	  src_len += tree_to_uhwi (len2);
1383 	  if (src_len < tree_to_uhwi (len1))
1384 	    src_len = tree_to_uhwi (len1);
1385 	  if (src_len > 1024)
1386 	    break;
1387 
1388 	  /* If mempcpy value is used elsewhere, bail out, as mempcpy
1389 	     with bigger length will return different result.  */
1390 	  if (lhs1 != NULL_TREE
1391 	      && DECL_FUNCTION_CODE (callee1) == BUILT_IN_MEMPCPY
1392 	      && (TREE_CODE (lhs1) != SSA_NAME
1393 		  || !single_imm_use (lhs1, &use_p, &use_stmt)
1394 		  || use_stmt != stmt2))
1395 	    break;
1396 
1397 	  /* If anything reads memory in between memcpy and memset
1398 	     call, the modified memcpy call might change it.  */
1399 	  vdef = gimple_vdef (stmt1);
1400 	  if (vdef != NULL
1401 	      && (!single_imm_use (vdef, &use_p, &use_stmt)
1402 		  || use_stmt != stmt2))
1403 	    break;
1404 
1405 	  ptr1_align = get_pointer_alignment (ptr1);
1406 	  /* Construct the new source string literal.  */
1407 	  src_buf = XALLOCAVEC (char, src_len + 1);
1408 	  if (callee1)
1409 	    memcpy (src_buf,
1410 		    TREE_STRING_POINTER (str1) + tree_to_uhwi (off1),
1411 		    tree_to_uhwi (len1));
1412 	  else
1413 	    src_buf[0] = tree_to_shwi (src1);
1414 	  memset (src_buf + tree_to_uhwi (diff),
1415 		  tree_to_shwi (val2), tree_to_uhwi (len2));
1416 	  src_buf[src_len] = '\0';
1417 	  /* Neither builtin_strncpy_read_str nor builtin_memcpy_read_str
1418 	     handle embedded '\0's.  */
1419 	  if (strlen (src_buf) != src_len)
1420 	    break;
1421 	  rtl_profile_for_bb (gimple_bb (stmt2));
1422 	  /* If the new memcpy wouldn't be emitted by storing the literal
1423 	     by pieces, this optimization might enlarge .rodata too much,
1424 	     as commonly used string literals couldn't be shared any
1425 	     longer.  */
1426 	  if (!can_store_by_pieces (src_len,
1427 				    builtin_strncpy_read_str,
1428 				    src_buf, ptr1_align, false))
1429 	    break;
1430 
1431 	  new_str_cst = build_string_literal (src_len, src_buf);
1432 	  if (callee1)
1433 	    {
1434 	      /* If STMT1 is a mem{,p}cpy call, adjust it and remove
1435 		 memset call.  */
1436 	      if (lhs1 && DECL_FUNCTION_CODE (callee1) == BUILT_IN_MEMPCPY)
1437 		gimple_call_set_lhs (stmt1, NULL_TREE);
1438 	      gimple_call_set_arg (stmt1, 1, new_str_cst);
1439 	      gimple_call_set_arg (stmt1, 2,
1440 				   build_int_cst (TREE_TYPE (len1), src_len));
1441 	      update_stmt (stmt1);
1442 	      unlink_stmt_vdef (stmt2);
1443 	      gsi_remove (gsi_p, true);
1444 	      fwprop_invalidate_lattice (gimple_get_lhs (stmt2));
1445 	      release_defs (stmt2);
1446 	      if (lhs1 && DECL_FUNCTION_CODE (callee1) == BUILT_IN_MEMPCPY)
1447 		{
1448 		  fwprop_invalidate_lattice (lhs1);
1449 		  release_ssa_name (lhs1);
1450 		}
1451 	      return true;
1452 	    }
1453 	  else
1454 	    {
1455 	      /* Otherwise, if STMT1 is length 1 memcpy optimized into
1456 		 assignment, remove STMT1 and change memset call into
1457 		 memcpy call.  */
1458 	      gimple_stmt_iterator gsi = gsi_for_stmt (stmt1);
1459 
1460 	      if (!is_gimple_val (ptr1))
1461 		ptr1 = force_gimple_operand_gsi (gsi_p, ptr1, true, NULL_TREE,
1462 						 true, GSI_SAME_STMT);
1463 	      gimple_call_set_fndecl (stmt2,
1464 				      builtin_decl_explicit (BUILT_IN_MEMCPY));
1465 	      gimple_call_set_arg (stmt2, 0, ptr1);
1466 	      gimple_call_set_arg (stmt2, 1, new_str_cst);
1467 	      gimple_call_set_arg (stmt2, 2,
1468 				   build_int_cst (TREE_TYPE (len2), src_len));
1469 	      unlink_stmt_vdef (stmt1);
1470 	      gsi_remove (&gsi, true);
1471 	      fwprop_invalidate_lattice (gimple_get_lhs (stmt1));
1472 	      release_defs (stmt1);
1473 	      update_stmt (stmt2);
1474 	      return false;
1475 	    }
1476 	}
1477       break;
1478     default:
1479       break;
1480     }
1481   return false;
1482 }
1483 
1484 /* Given a ssa_name in NAME see if it was defined by an assignment and
1485    set CODE to be the code and ARG1 to the first operand on the rhs and ARG2
1486    to the second operand on the rhs. */
1487 
1488 static inline void
1489 defcodefor_name (tree name, enum tree_code *code, tree *arg1, tree *arg2)
1490 {
1491   gimple def;
1492   enum tree_code code1;
1493   tree arg11;
1494   tree arg21;
1495   tree arg31;
1496   enum gimple_rhs_class grhs_class;
1497 
1498   code1 = TREE_CODE (name);
1499   arg11 = name;
1500   arg21 = NULL_TREE;
1501   grhs_class = get_gimple_rhs_class (code1);
1502 
1503   if (code1 == SSA_NAME)
1504     {
1505       def = SSA_NAME_DEF_STMT (name);
1506 
1507       if (def && is_gimple_assign (def)
1508 	  && can_propagate_from (def))
1509 	{
1510 	  code1 = gimple_assign_rhs_code (def);
1511 	  arg11 = gimple_assign_rhs1 (def);
1512           arg21 = gimple_assign_rhs2 (def);
1513           arg31 = gimple_assign_rhs2 (def);
1514 	}
1515     }
1516   else if (grhs_class == GIMPLE_TERNARY_RHS
1517 	   || GIMPLE_BINARY_RHS
1518 	   || GIMPLE_UNARY_RHS
1519 	   || GIMPLE_SINGLE_RHS)
1520     extract_ops_from_tree (name, &code1, &arg11, &arg21, &arg31);
1521 
1522   *code = code1;
1523   *arg1 = arg11;
1524   if (arg2)
1525     *arg2 = arg21;
1526   /* Ignore arg3 currently. */
1527 }
1528 
1529 
1530 /* Recognize rotation patterns.  Return true if a transformation
1531    applied, otherwise return false.
1532 
1533    We are looking for X with unsigned type T with bitsize B, OP being
1534    +, | or ^, some type T2 wider than T and
1535    (X << CNT1) OP (X >> CNT2)				iff CNT1 + CNT2 == B
1536    ((T) ((T2) X << CNT1)) OP ((T) ((T2) X >> CNT2))	iff CNT1 + CNT2 == B
1537    (X << Y) OP (X >> (B - Y))
1538    (X << (int) Y) OP (X >> (int) (B - Y))
1539    ((T) ((T2) X << Y)) OP ((T) ((T2) X >> (B - Y)))
1540    ((T) ((T2) X << (int) Y)) OP ((T) ((T2) X >> (int) (B - Y)))
1541    (X << Y) | (X >> ((-Y) & (B - 1)))
1542    (X << (int) Y) | (X >> (int) ((-Y) & (B - 1)))
1543    ((T) ((T2) X << Y)) | ((T) ((T2) X >> ((-Y) & (B - 1))))
1544    ((T) ((T2) X << (int) Y)) | ((T) ((T2) X >> (int) ((-Y) & (B - 1))))
1545 
1546    and transform these into:
1547    X r<< CNT1
1548    X r<< Y
1549 
1550    Note, in the patterns with T2 type, the type of OP operands
1551    might be even a signed type, but should have precision B.  */
1552 
1553 static bool
1554 simplify_rotate (gimple_stmt_iterator *gsi)
1555 {
1556   gimple stmt = gsi_stmt (*gsi);
1557   tree arg[2], rtype, rotcnt = NULL_TREE;
1558   tree def_arg1[2], def_arg2[2];
1559   enum tree_code def_code[2];
1560   tree lhs;
1561   int i;
1562   bool swapped_p = false;
1563   gimple g;
1564 
1565   arg[0] = gimple_assign_rhs1 (stmt);
1566   arg[1] = gimple_assign_rhs2 (stmt);
1567   rtype = TREE_TYPE (arg[0]);
1568 
1569   /* Only create rotates in complete modes.  Other cases are not
1570      expanded properly.  */
1571   if (!INTEGRAL_TYPE_P (rtype)
1572       || TYPE_PRECISION (rtype) != GET_MODE_PRECISION (TYPE_MODE (rtype)))
1573     return false;
1574 
1575   for (i = 0; i < 2; i++)
1576     defcodefor_name (arg[i], &def_code[i], &def_arg1[i], &def_arg2[i]);
1577 
1578   /* Look through narrowing conversions.  */
1579   if (CONVERT_EXPR_CODE_P (def_code[0])
1580       && CONVERT_EXPR_CODE_P (def_code[1])
1581       && INTEGRAL_TYPE_P (TREE_TYPE (def_arg1[0]))
1582       && INTEGRAL_TYPE_P (TREE_TYPE (def_arg1[1]))
1583       && TYPE_PRECISION (TREE_TYPE (def_arg1[0]))
1584 	 == TYPE_PRECISION (TREE_TYPE (def_arg1[1]))
1585       && TYPE_PRECISION (TREE_TYPE (def_arg1[0])) > TYPE_PRECISION (rtype)
1586       && has_single_use (arg[0])
1587       && has_single_use (arg[1]))
1588     {
1589       for (i = 0; i < 2; i++)
1590 	{
1591 	  arg[i] = def_arg1[i];
1592 	  defcodefor_name (arg[i], &def_code[i], &def_arg1[i], &def_arg2[i]);
1593 	}
1594     }
1595 
1596   /* One operand has to be LSHIFT_EXPR and one RSHIFT_EXPR.  */
1597   for (i = 0; i < 2; i++)
1598     if (def_code[i] != LSHIFT_EXPR && def_code[i] != RSHIFT_EXPR)
1599       return false;
1600     else if (!has_single_use (arg[i]))
1601       return false;
1602   if (def_code[0] == def_code[1])
1603     return false;
1604 
1605   /* If we've looked through narrowing conversions before, look through
1606      widening conversions from unsigned type with the same precision
1607      as rtype here.  */
1608   if (TYPE_PRECISION (TREE_TYPE (def_arg1[0])) != TYPE_PRECISION (rtype))
1609     for (i = 0; i < 2; i++)
1610       {
1611 	tree tem;
1612 	enum tree_code code;
1613 	defcodefor_name (def_arg1[i], &code, &tem, NULL);
1614 	if (!CONVERT_EXPR_CODE_P (code)
1615 	    || !INTEGRAL_TYPE_P (TREE_TYPE (tem))
1616 	    || TYPE_PRECISION (TREE_TYPE (tem)) != TYPE_PRECISION (rtype))
1617 	  return false;
1618 	def_arg1[i] = tem;
1619       }
1620   /* Both shifts have to use the same first operand.  */
1621   if (TREE_CODE (def_arg1[0]) != SSA_NAME || def_arg1[0] != def_arg1[1])
1622     return false;
1623   if (!TYPE_UNSIGNED (TREE_TYPE (def_arg1[0])))
1624     return false;
1625 
1626   /* CNT1 + CNT2 == B case above.  */
1627   if (tree_fits_uhwi_p (def_arg2[0])
1628       && tree_fits_uhwi_p (def_arg2[1])
1629       && tree_to_uhwi (def_arg2[0])
1630 	 + tree_to_uhwi (def_arg2[1]) == TYPE_PRECISION (rtype))
1631     rotcnt = def_arg2[0];
1632   else if (TREE_CODE (def_arg2[0]) != SSA_NAME
1633 	   || TREE_CODE (def_arg2[1]) != SSA_NAME)
1634     return false;
1635   else
1636     {
1637       tree cdef_arg1[2], cdef_arg2[2], def_arg2_alt[2];
1638       enum tree_code cdef_code[2];
1639       /* Look through conversion of the shift count argument.
1640 	 The C/C++ FE cast any shift count argument to integer_type_node.
1641 	 The only problem might be if the shift count type maximum value
1642 	 is equal or smaller than number of bits in rtype.  */
1643       for (i = 0; i < 2; i++)
1644 	{
1645 	  def_arg2_alt[i] = def_arg2[i];
1646 	  defcodefor_name (def_arg2[i], &cdef_code[i],
1647 			   &cdef_arg1[i], &cdef_arg2[i]);
1648 	  if (CONVERT_EXPR_CODE_P (cdef_code[i])
1649 	      && INTEGRAL_TYPE_P (TREE_TYPE (cdef_arg1[i]))
1650 	      && TYPE_PRECISION (TREE_TYPE (cdef_arg1[i]))
1651 		 > floor_log2 (TYPE_PRECISION (rtype))
1652 	      && TYPE_PRECISION (TREE_TYPE (cdef_arg1[i]))
1653 		 == GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (cdef_arg1[i]))))
1654 	    {
1655 	      def_arg2_alt[i] = cdef_arg1[i];
1656 	      defcodefor_name (def_arg2_alt[i], &cdef_code[i],
1657 			       &cdef_arg1[i], &cdef_arg2[i]);
1658 	    }
1659 	}
1660       for (i = 0; i < 2; i++)
1661 	/* Check for one shift count being Y and the other B - Y,
1662 	   with optional casts.  */
1663 	if (cdef_code[i] == MINUS_EXPR
1664 	    && tree_fits_shwi_p (cdef_arg1[i])
1665 	    && tree_to_shwi (cdef_arg1[i]) == TYPE_PRECISION (rtype)
1666 	    && TREE_CODE (cdef_arg2[i]) == SSA_NAME)
1667 	  {
1668 	    tree tem;
1669 	    enum tree_code code;
1670 
1671 	    if (cdef_arg2[i] == def_arg2[1 - i]
1672 		|| cdef_arg2[i] == def_arg2_alt[1 - i])
1673 	      {
1674 		rotcnt = cdef_arg2[i];
1675 		break;
1676 	      }
1677 	    defcodefor_name (cdef_arg2[i], &code, &tem, NULL);
1678 	    if (CONVERT_EXPR_CODE_P (code)
1679 		&& INTEGRAL_TYPE_P (TREE_TYPE (tem))
1680 		&& TYPE_PRECISION (TREE_TYPE (tem))
1681 		 > floor_log2 (TYPE_PRECISION (rtype))
1682 		&& TYPE_PRECISION (TREE_TYPE (tem))
1683 		 == GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (tem)))
1684 		&& (tem == def_arg2[1 - i]
1685 		    || tem == def_arg2_alt[1 - i]))
1686 	      {
1687 		rotcnt = tem;
1688 		break;
1689 	      }
1690 	  }
1691 	/* The above sequence isn't safe for Y being 0,
1692 	   because then one of the shifts triggers undefined behavior.
1693 	   This alternative is safe even for rotation count of 0.
1694 	   One shift count is Y and the other (-Y) & (B - 1).  */
1695 	else if (cdef_code[i] == BIT_AND_EXPR
1696 		 && tree_fits_shwi_p (cdef_arg2[i])
1697 		 && tree_to_shwi (cdef_arg2[i])
1698 		    == TYPE_PRECISION (rtype) - 1
1699 		 && TREE_CODE (cdef_arg1[i]) == SSA_NAME
1700 		 && gimple_assign_rhs_code (stmt) == BIT_IOR_EXPR)
1701 	  {
1702 	    tree tem;
1703 	    enum tree_code code;
1704 
1705 	    defcodefor_name (cdef_arg1[i], &code, &tem, NULL);
1706 	    if (CONVERT_EXPR_CODE_P (code)
1707 		&& INTEGRAL_TYPE_P (TREE_TYPE (tem))
1708 		&& TYPE_PRECISION (TREE_TYPE (tem))
1709 		 > floor_log2 (TYPE_PRECISION (rtype))
1710 		&& TYPE_PRECISION (TREE_TYPE (tem))
1711 		 == GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (tem))))
1712 	      defcodefor_name (tem, &code, &tem, NULL);
1713 
1714 	    if (code == NEGATE_EXPR)
1715 	      {
1716 		if (tem == def_arg2[1 - i] || tem == def_arg2_alt[1 - i])
1717 		  {
1718 		    rotcnt = tem;
1719 		    break;
1720 		  }
1721 		defcodefor_name (tem, &code, &tem, NULL);
1722 		if (CONVERT_EXPR_CODE_P (code)
1723 		    && INTEGRAL_TYPE_P (TREE_TYPE (tem))
1724 		    && TYPE_PRECISION (TREE_TYPE (tem))
1725 		       > floor_log2 (TYPE_PRECISION (rtype))
1726 		    && TYPE_PRECISION (TREE_TYPE (tem))
1727 		       == GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (tem)))
1728 		    && (tem == def_arg2[1 - i]
1729 			|| tem == def_arg2_alt[1 - i]))
1730 		  {
1731 		    rotcnt = tem;
1732 		    break;
1733 		  }
1734 	      }
1735 	  }
1736       if (rotcnt == NULL_TREE)
1737 	return false;
1738       swapped_p = i != 1;
1739     }
1740 
1741   if (!useless_type_conversion_p (TREE_TYPE (def_arg2[0]),
1742 				  TREE_TYPE (rotcnt)))
1743     {
1744       g = gimple_build_assign (make_ssa_name (TREE_TYPE (def_arg2[0])),
1745 			       NOP_EXPR, rotcnt);
1746       gsi_insert_before (gsi, g, GSI_SAME_STMT);
1747       rotcnt = gimple_assign_lhs (g);
1748     }
1749   lhs = gimple_assign_lhs (stmt);
1750   if (!useless_type_conversion_p (rtype, TREE_TYPE (def_arg1[0])))
1751     lhs = make_ssa_name (TREE_TYPE (def_arg1[0]));
1752   g = gimple_build_assign (lhs,
1753 			   ((def_code[0] == LSHIFT_EXPR) ^ swapped_p)
1754 			   ? LROTATE_EXPR : RROTATE_EXPR, def_arg1[0], rotcnt);
1755   if (!useless_type_conversion_p (rtype, TREE_TYPE (def_arg1[0])))
1756     {
1757       gsi_insert_before (gsi, g, GSI_SAME_STMT);
1758       g = gimple_build_assign (gimple_assign_lhs (stmt), NOP_EXPR, lhs);
1759     }
1760   gsi_replace (gsi, g, false);
1761   return true;
1762 }
1763 
1764 /* Combine an element access with a shuffle.  Returns true if there were
1765    any changes made, else it returns false.  */
1766 
1767 static bool
1768 simplify_bitfield_ref (gimple_stmt_iterator *gsi)
1769 {
1770   gimple stmt = gsi_stmt (*gsi);
1771   gimple def_stmt;
1772   tree op, op0, op1, op2;
1773   tree elem_type;
1774   unsigned idx, n, size;
1775   enum tree_code code;
1776 
1777   op = gimple_assign_rhs1 (stmt);
1778   gcc_checking_assert (TREE_CODE (op) == BIT_FIELD_REF);
1779 
1780   op0 = TREE_OPERAND (op, 0);
1781   if (TREE_CODE (op0) != SSA_NAME
1782       || TREE_CODE (TREE_TYPE (op0)) != VECTOR_TYPE)
1783     return false;
1784 
1785   def_stmt = get_prop_source_stmt (op0, false, NULL);
1786   if (!def_stmt || !can_propagate_from (def_stmt))
1787     return false;
1788 
1789   op1 = TREE_OPERAND (op, 1);
1790   op2 = TREE_OPERAND (op, 2);
1791   code = gimple_assign_rhs_code (def_stmt);
1792 
1793   if (code == CONSTRUCTOR)
1794     {
1795       tree tem = fold_ternary (BIT_FIELD_REF, TREE_TYPE (op),
1796 			       gimple_assign_rhs1 (def_stmt), op1, op2);
1797       if (!tem || !valid_gimple_rhs_p (tem))
1798 	return false;
1799       gimple_assign_set_rhs_from_tree (gsi, tem);
1800       update_stmt (gsi_stmt (*gsi));
1801       return true;
1802     }
1803 
1804   elem_type = TREE_TYPE (TREE_TYPE (op0));
1805   if (TREE_TYPE (op) != elem_type)
1806     return false;
1807 
1808   size = TREE_INT_CST_LOW (TYPE_SIZE (elem_type));
1809   n = TREE_INT_CST_LOW (op1) / size;
1810   if (n != 1)
1811     return false;
1812   idx = TREE_INT_CST_LOW (op2) / size;
1813 
1814   if (code == VEC_PERM_EXPR)
1815     {
1816       tree p, m, index, tem;
1817       unsigned nelts;
1818       m = gimple_assign_rhs3 (def_stmt);
1819       if (TREE_CODE (m) != VECTOR_CST)
1820 	return false;
1821       nelts = VECTOR_CST_NELTS (m);
1822       idx = TREE_INT_CST_LOW (VECTOR_CST_ELT (m, idx));
1823       idx %= 2 * nelts;
1824       if (idx < nelts)
1825 	{
1826 	  p = gimple_assign_rhs1 (def_stmt);
1827 	}
1828       else
1829 	{
1830 	  p = gimple_assign_rhs2 (def_stmt);
1831 	  idx -= nelts;
1832 	}
1833       index = build_int_cst (TREE_TYPE (TREE_TYPE (m)), idx * size);
1834       tem = build3 (BIT_FIELD_REF, TREE_TYPE (op),
1835 		    unshare_expr (p), op1, index);
1836       gimple_assign_set_rhs1 (stmt, tem);
1837       fold_stmt (gsi);
1838       update_stmt (gsi_stmt (*gsi));
1839       return true;
1840     }
1841 
1842   return false;
1843 }
1844 
1845 /* Determine whether applying the 2 permutations (mask1 then mask2)
1846    gives back one of the input.  */
1847 
1848 static int
1849 is_combined_permutation_identity (tree mask1, tree mask2)
1850 {
1851   tree mask;
1852   unsigned int nelts, i, j;
1853   bool maybe_identity1 = true;
1854   bool maybe_identity2 = true;
1855 
1856   gcc_checking_assert (TREE_CODE (mask1) == VECTOR_CST
1857 		       && TREE_CODE (mask2) == VECTOR_CST);
1858   mask = fold_ternary (VEC_PERM_EXPR, TREE_TYPE (mask1), mask1, mask1, mask2);
1859   gcc_assert (TREE_CODE (mask) == VECTOR_CST);
1860 
1861   nelts = VECTOR_CST_NELTS (mask);
1862   for (i = 0; i < nelts; i++)
1863     {
1864       tree val = VECTOR_CST_ELT (mask, i);
1865       gcc_assert (TREE_CODE (val) == INTEGER_CST);
1866       j = TREE_INT_CST_LOW (val) & (2 * nelts - 1);
1867       if (j == i)
1868 	maybe_identity2 = false;
1869       else if (j == i + nelts)
1870 	maybe_identity1 = false;
1871       else
1872 	return 0;
1873     }
1874   return maybe_identity1 ? 1 : maybe_identity2 ? 2 : 0;
1875 }
1876 
1877 /* Combine a shuffle with its arguments.  Returns 1 if there were any
1878    changes made, 2 if cfg-cleanup needs to run.  Else it returns 0.  */
1879 
1880 static int
1881 simplify_permutation (gimple_stmt_iterator *gsi)
1882 {
1883   gimple stmt = gsi_stmt (*gsi);
1884   gimple def_stmt;
1885   tree op0, op1, op2, op3, arg0, arg1;
1886   enum tree_code code;
1887   bool single_use_op0 = false;
1888 
1889   gcc_checking_assert (gimple_assign_rhs_code (stmt) == VEC_PERM_EXPR);
1890 
1891   op0 = gimple_assign_rhs1 (stmt);
1892   op1 = gimple_assign_rhs2 (stmt);
1893   op2 = gimple_assign_rhs3 (stmt);
1894 
1895   if (TREE_CODE (op2) != VECTOR_CST)
1896     return 0;
1897 
1898   if (TREE_CODE (op0) == VECTOR_CST)
1899     {
1900       code = VECTOR_CST;
1901       arg0 = op0;
1902     }
1903   else if (TREE_CODE (op0) == SSA_NAME)
1904     {
1905       def_stmt = get_prop_source_stmt (op0, false, &single_use_op0);
1906       if (!def_stmt || !can_propagate_from (def_stmt))
1907 	return 0;
1908 
1909       code = gimple_assign_rhs_code (def_stmt);
1910       arg0 = gimple_assign_rhs1 (def_stmt);
1911     }
1912   else
1913     return 0;
1914 
1915   /* Two consecutive shuffles.  */
1916   if (code == VEC_PERM_EXPR)
1917     {
1918       tree orig;
1919       int ident;
1920 
1921       if (op0 != op1)
1922 	return 0;
1923       op3 = gimple_assign_rhs3 (def_stmt);
1924       if (TREE_CODE (op3) != VECTOR_CST)
1925 	return 0;
1926       ident = is_combined_permutation_identity (op3, op2);
1927       if (!ident)
1928 	return 0;
1929       orig = (ident == 1) ? gimple_assign_rhs1 (def_stmt)
1930 			  : gimple_assign_rhs2 (def_stmt);
1931       gimple_assign_set_rhs1 (stmt, unshare_expr (orig));
1932       gimple_assign_set_rhs_code (stmt, TREE_CODE (orig));
1933       gimple_set_num_ops (stmt, 2);
1934       update_stmt (stmt);
1935       return remove_prop_source_from_use (op0) ? 2 : 1;
1936     }
1937 
1938   /* Shuffle of a constructor.  */
1939   else if (code == CONSTRUCTOR || code == VECTOR_CST)
1940     {
1941       tree opt;
1942       bool ret = false;
1943       if (op0 != op1)
1944 	{
1945 	  if (TREE_CODE (op0) == SSA_NAME && !single_use_op0)
1946 	    return 0;
1947 
1948 	  if (TREE_CODE (op1) == VECTOR_CST)
1949 	    arg1 = op1;
1950 	  else if (TREE_CODE (op1) == SSA_NAME)
1951 	    {
1952 	      enum tree_code code2;
1953 
1954 	      gimple def_stmt2 = get_prop_source_stmt (op1, true, NULL);
1955 	      if (!def_stmt2 || !can_propagate_from (def_stmt2))
1956 		return 0;
1957 
1958 	      code2 = gimple_assign_rhs_code (def_stmt2);
1959 	      if (code2 != CONSTRUCTOR && code2 != VECTOR_CST)
1960 		return 0;
1961 	      arg1 = gimple_assign_rhs1 (def_stmt2);
1962 	    }
1963 	  else
1964 	    return 0;
1965 	}
1966       else
1967 	{
1968 	  /* Already used twice in this statement.  */
1969 	  if (TREE_CODE (op0) == SSA_NAME && num_imm_uses (op0) > 2)
1970 	    return 0;
1971 	  arg1 = arg0;
1972 	}
1973       opt = fold_ternary (VEC_PERM_EXPR, TREE_TYPE (op0), arg0, arg1, op2);
1974       if (!opt
1975 	  || (TREE_CODE (opt) != CONSTRUCTOR && TREE_CODE (opt) != VECTOR_CST))
1976 	return 0;
1977       gimple_assign_set_rhs_from_tree (gsi, opt);
1978       update_stmt (gsi_stmt (*gsi));
1979       if (TREE_CODE (op0) == SSA_NAME)
1980 	ret = remove_prop_source_from_use (op0);
1981       if (op0 != op1 && TREE_CODE (op1) == SSA_NAME)
1982 	ret |= remove_prop_source_from_use (op1);
1983       return ret ? 2 : 1;
1984     }
1985 
1986   return 0;
1987 }
1988 
1989 /* Recognize a VEC_PERM_EXPR.  Returns true if there were any changes.  */
1990 
1991 static bool
1992 simplify_vector_constructor (gimple_stmt_iterator *gsi)
1993 {
1994   gimple stmt = gsi_stmt (*gsi);
1995   gimple def_stmt;
1996   tree op, op2, orig, type, elem_type;
1997   unsigned elem_size, nelts, i;
1998   enum tree_code code;
1999   constructor_elt *elt;
2000   unsigned char *sel;
2001   bool maybe_ident;
2002 
2003   gcc_checking_assert (gimple_assign_rhs_code (stmt) == CONSTRUCTOR);
2004 
2005   op = gimple_assign_rhs1 (stmt);
2006   type = TREE_TYPE (op);
2007   gcc_checking_assert (TREE_CODE (type) == VECTOR_TYPE);
2008 
2009   nelts = TYPE_VECTOR_SUBPARTS (type);
2010   elem_type = TREE_TYPE (type);
2011   elem_size = TREE_INT_CST_LOW (TYPE_SIZE (elem_type));
2012 
2013   sel = XALLOCAVEC (unsigned char, nelts);
2014   orig = NULL;
2015   maybe_ident = true;
2016   FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (op), i, elt)
2017     {
2018       tree ref, op1;
2019 
2020       if (i >= nelts)
2021 	return false;
2022 
2023       if (TREE_CODE (elt->value) != SSA_NAME)
2024 	return false;
2025       def_stmt = get_prop_source_stmt (elt->value, false, NULL);
2026       if (!def_stmt)
2027 	return false;
2028       code = gimple_assign_rhs_code (def_stmt);
2029       if (code != BIT_FIELD_REF)
2030 	return false;
2031       op1 = gimple_assign_rhs1 (def_stmt);
2032       ref = TREE_OPERAND (op1, 0);
2033       if (orig)
2034 	{
2035 	  if (ref != orig)
2036 	    return false;
2037 	}
2038       else
2039 	{
2040 	  if (TREE_CODE (ref) != SSA_NAME)
2041 	    return false;
2042 	  if (!useless_type_conversion_p (type, TREE_TYPE (ref)))
2043 	    return false;
2044 	  orig = ref;
2045 	}
2046       if (TREE_INT_CST_LOW (TREE_OPERAND (op1, 1)) != elem_size)
2047 	return false;
2048       sel[i] = TREE_INT_CST_LOW (TREE_OPERAND (op1, 2)) / elem_size;
2049       if (sel[i] != i) maybe_ident = false;
2050     }
2051   if (i < nelts)
2052     return false;
2053 
2054   if (maybe_ident)
2055     gimple_assign_set_rhs_from_tree (gsi, orig);
2056   else
2057     {
2058       tree mask_type, *mask_elts;
2059 
2060       if (!can_vec_perm_p (TYPE_MODE (type), false, sel))
2061 	return false;
2062       mask_type
2063 	= build_vector_type (build_nonstandard_integer_type (elem_size, 1),
2064 			     nelts);
2065       if (GET_MODE_CLASS (TYPE_MODE (mask_type)) != MODE_VECTOR_INT
2066 	  || GET_MODE_SIZE (TYPE_MODE (mask_type))
2067 	     != GET_MODE_SIZE (TYPE_MODE (type)))
2068 	return false;
2069       mask_elts = XALLOCAVEC (tree, nelts);
2070       for (i = 0; i < nelts; i++)
2071 	mask_elts[i] = build_int_cst (TREE_TYPE (mask_type), sel[i]);
2072       op2 = build_vector (mask_type, mask_elts);
2073       gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR, orig, orig, op2);
2074     }
2075   update_stmt (gsi_stmt (*gsi));
2076   return true;
2077 }
2078 
2079 
2080 /* Primitive "lattice" function for gimple_simplify.  */
2081 
2082 static tree
2083 fwprop_ssa_val (tree name)
2084 {
2085   /* First valueize NAME.  */
2086   if (TREE_CODE (name) == SSA_NAME
2087       && SSA_NAME_VERSION (name) < lattice.length ())
2088     {
2089       tree val = lattice[SSA_NAME_VERSION (name)];
2090       if (val)
2091 	name = val;
2092     }
2093   /* We continue matching along SSA use-def edges for SSA names
2094      that are not single-use.  Currently there are no patterns
2095      that would cause any issues with that.  */
2096   return name;
2097 }
2098 
2099 /* Main entry point for the forward propagation and statement combine
2100    optimizer.  */
2101 
2102 namespace {
2103 
2104 const pass_data pass_data_forwprop =
2105 {
2106   GIMPLE_PASS, /* type */
2107   "forwprop", /* name */
2108   OPTGROUP_NONE, /* optinfo_flags */
2109   TV_TREE_FORWPROP, /* tv_id */
2110   ( PROP_cfg | PROP_ssa ), /* properties_required */
2111   0, /* properties_provided */
2112   0, /* properties_destroyed */
2113   0, /* todo_flags_start */
2114   TODO_update_ssa, /* todo_flags_finish */
2115 };
2116 
2117 class pass_forwprop : public gimple_opt_pass
2118 {
2119 public:
2120   pass_forwprop (gcc::context *ctxt)
2121     : gimple_opt_pass (pass_data_forwprop, ctxt)
2122   {}
2123 
2124   /* opt_pass methods: */
2125   opt_pass * clone () { return new pass_forwprop (m_ctxt); }
2126   virtual bool gate (function *) { return flag_tree_forwprop; }
2127   virtual unsigned int execute (function *);
2128 
2129 }; // class pass_forwprop
2130 
2131 unsigned int
2132 pass_forwprop::execute (function *fun)
2133 {
2134   unsigned int todoflags = 0;
2135 
2136   cfg_changed = false;
2137 
2138   /* Combine stmts with the stmts defining their operands.  Do that
2139      in an order that guarantees visiting SSA defs before SSA uses.  */
2140   lattice.create (num_ssa_names);
2141   lattice.quick_grow_cleared (num_ssa_names);
2142   int *postorder = XNEWVEC (int, n_basic_blocks_for_fn (fun));
2143   int postorder_num = inverted_post_order_compute (postorder);
2144   auto_vec<gimple, 4> to_fixup;
2145   to_purge = BITMAP_ALLOC (NULL);
2146   for (int i = 0; i < postorder_num; ++i)
2147     {
2148       gimple_stmt_iterator gsi;
2149       basic_block bb = BASIC_BLOCK_FOR_FN (fun, postorder[i]);
2150 
2151       /* Apply forward propagation to all stmts in the basic-block.
2152 	 Note we update GSI within the loop as necessary.  */
2153       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
2154 	{
2155 	  gimple stmt = gsi_stmt (gsi);
2156 	  tree lhs, rhs;
2157 	  enum tree_code code;
2158 
2159 	  if (!is_gimple_assign (stmt))
2160 	    {
2161 	      gsi_next (&gsi);
2162 	      continue;
2163 	    }
2164 
2165 	  lhs = gimple_assign_lhs (stmt);
2166 	  rhs = gimple_assign_rhs1 (stmt);
2167 	  code = gimple_assign_rhs_code (stmt);
2168 	  if (TREE_CODE (lhs) != SSA_NAME
2169 	      || has_zero_uses (lhs))
2170 	    {
2171 	      gsi_next (&gsi);
2172 	      continue;
2173 	    }
2174 
2175 	  /* If this statement sets an SSA_NAME to an address,
2176 	     try to propagate the address into the uses of the SSA_NAME.  */
2177 	  if (code == ADDR_EXPR
2178 	      /* Handle pointer conversions on invariant addresses
2179 		 as well, as this is valid gimple.  */
2180 	      || (CONVERT_EXPR_CODE_P (code)
2181 		  && TREE_CODE (rhs) == ADDR_EXPR
2182 		  && POINTER_TYPE_P (TREE_TYPE (lhs))))
2183 	    {
2184 	      tree base = get_base_address (TREE_OPERAND (rhs, 0));
2185 	      if ((!base
2186 		   || !DECL_P (base)
2187 		   || decl_address_invariant_p (base))
2188 		  && !stmt_references_abnormal_ssa_name (stmt)
2189 		  && forward_propagate_addr_expr (lhs, rhs, true))
2190 		{
2191 		  fwprop_invalidate_lattice (gimple_get_lhs (stmt));
2192 		  release_defs (stmt);
2193 		  gsi_remove (&gsi, true);
2194 		}
2195 	      else
2196 		gsi_next (&gsi);
2197 	    }
2198 	  else if (code == POINTER_PLUS_EXPR)
2199 	    {
2200 	      tree off = gimple_assign_rhs2 (stmt);
2201 	      if (TREE_CODE (off) == INTEGER_CST
2202 		  && can_propagate_from (stmt)
2203 		  && !simple_iv_increment_p (stmt)
2204 		  /* ???  Better adjust the interface to that function
2205 		     instead of building new trees here.  */
2206 		  && forward_propagate_addr_expr
2207 		       (lhs,
2208 			build1_loc (gimple_location (stmt),
2209 				    ADDR_EXPR, TREE_TYPE (rhs),
2210 				    fold_build2 (MEM_REF,
2211 						 TREE_TYPE (TREE_TYPE (rhs)),
2212 						 rhs,
2213 						 fold_convert (ptr_type_node,
2214 							       off))), true))
2215 		{
2216 		  fwprop_invalidate_lattice (gimple_get_lhs (stmt));
2217 		  release_defs (stmt);
2218 		  gsi_remove (&gsi, true);
2219 		}
2220 	      else if (is_gimple_min_invariant (rhs))
2221 		{
2222 		  /* Make sure to fold &a[0] + off_1 here.  */
2223 		  fold_stmt_inplace (&gsi);
2224 		  update_stmt (stmt);
2225 		  if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR)
2226 		    gsi_next (&gsi);
2227 		}
2228 	      else
2229 		gsi_next (&gsi);
2230 	    }
2231 	  else if (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE
2232 		   && gimple_assign_load_p (stmt)
2233 		   && !gimple_has_volatile_ops (stmt)
2234 		   && (TREE_CODE (gimple_assign_rhs1 (stmt))
2235 		       != TARGET_MEM_REF)
2236 		   && !stmt_can_throw_internal (stmt))
2237 	    {
2238 	      /* Rewrite loads used only in real/imagpart extractions to
2239 	         component-wise loads.  */
2240 	      use_operand_p use_p;
2241 	      imm_use_iterator iter;
2242 	      bool rewrite = true;
2243 	      FOR_EACH_IMM_USE_FAST (use_p, iter, lhs)
2244 		{
2245 		  gimple use_stmt = USE_STMT (use_p);
2246 		  if (is_gimple_debug (use_stmt))
2247 		    continue;
2248 		  if (!is_gimple_assign (use_stmt)
2249 		      || (gimple_assign_rhs_code (use_stmt) != REALPART_EXPR
2250 			  && gimple_assign_rhs_code (use_stmt) != IMAGPART_EXPR))
2251 		    {
2252 		      rewrite = false;
2253 		      break;
2254 		    }
2255 		}
2256 	      if (rewrite)
2257 		{
2258 		  gimple use_stmt;
2259 		  FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
2260 		    {
2261 		      if (is_gimple_debug (use_stmt))
2262 			{
2263 			  if (gimple_debug_bind_p (use_stmt))
2264 			    {
2265 			      gimple_debug_bind_reset_value (use_stmt);
2266 			      update_stmt (use_stmt);
2267 			    }
2268 			  continue;
2269 			}
2270 
2271 		      tree new_rhs = build1 (gimple_assign_rhs_code (use_stmt),
2272 					     TREE_TYPE (TREE_TYPE (rhs)),
2273 					     unshare_expr (rhs));
2274 		      gimple new_stmt
2275 			= gimple_build_assign (gimple_assign_lhs (use_stmt),
2276 					       new_rhs);
2277 
2278 		      location_t loc = gimple_location (use_stmt);
2279 		      gimple_set_location (new_stmt, loc);
2280 		      gimple_stmt_iterator gsi2 = gsi_for_stmt (use_stmt);
2281 		      unlink_stmt_vdef (use_stmt);
2282 		      gsi_remove (&gsi2, true);
2283 
2284 		      gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT);
2285 		    }
2286 
2287 		  release_defs (stmt);
2288 		  gsi_remove (&gsi, true);
2289 		}
2290 	      else
2291 		gsi_next (&gsi);
2292 	    }
2293 	  else if (code == COMPLEX_EXPR)
2294 	    {
2295 	      /* Rewrite stores of a single-use complex build expression
2296 	         to component-wise stores.  */
2297 	      use_operand_p use_p;
2298 	      gimple use_stmt;
2299 	      if (single_imm_use (lhs, &use_p, &use_stmt)
2300 		  && gimple_store_p (use_stmt)
2301 		  && !gimple_has_volatile_ops (use_stmt)
2302 		  && is_gimple_assign (use_stmt)
2303 		  && (TREE_CODE (gimple_assign_lhs (use_stmt))
2304 		      != TARGET_MEM_REF))
2305 		{
2306 		  tree use_lhs = gimple_assign_lhs (use_stmt);
2307 		  tree new_lhs = build1 (REALPART_EXPR,
2308 					 TREE_TYPE (TREE_TYPE (use_lhs)),
2309 					 unshare_expr (use_lhs));
2310 		  gimple new_stmt = gimple_build_assign (new_lhs, rhs);
2311 		  location_t loc = gimple_location (use_stmt);
2312 		  gimple_set_location (new_stmt, loc);
2313 		  gimple_set_vuse (new_stmt, gimple_vuse (use_stmt));
2314 		  gimple_set_vdef (new_stmt, make_ssa_name (gimple_vop (cfun)));
2315 		  SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
2316 		  gimple_set_vuse (use_stmt, gimple_vdef (new_stmt));
2317 		  gimple_stmt_iterator gsi2 = gsi_for_stmt (use_stmt);
2318 		  gsi_insert_before (&gsi2, new_stmt, GSI_SAME_STMT);
2319 
2320 		  new_lhs = build1 (IMAGPART_EXPR,
2321 				    TREE_TYPE (TREE_TYPE (use_lhs)),
2322 				    unshare_expr (use_lhs));
2323 		  gimple_assign_set_lhs (use_stmt, new_lhs);
2324 		  gimple_assign_set_rhs1 (use_stmt, gimple_assign_rhs2 (stmt));
2325 		  update_stmt (use_stmt);
2326 
2327 		  release_defs (stmt);
2328 		  gsi_remove (&gsi, true);
2329 		}
2330 	      else
2331 		gsi_next (&gsi);
2332 	    }
2333 	  else
2334 	    gsi_next (&gsi);
2335 	}
2336 
2337       /* Combine stmts with the stmts defining their operands.
2338 	 Note we update GSI within the loop as necessary.  */
2339       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
2340 	{
2341 	  gimple stmt = gsi_stmt (gsi);
2342 	  gimple orig_stmt = stmt;
2343 	  bool changed = false;
2344 	  bool was_noreturn = (is_gimple_call (stmt)
2345 			       && gimple_call_noreturn_p (stmt));
2346 
2347 	  /* Mark stmt as potentially needing revisiting.  */
2348 	  gimple_set_plf (stmt, GF_PLF_1, false);
2349 
2350 	  if (fold_stmt (&gsi, fwprop_ssa_val))
2351 	    {
2352 	      changed = true;
2353 	      stmt = gsi_stmt (gsi);
2354 	      if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
2355 		bitmap_set_bit (to_purge, bb->index);
2356 	      if (!was_noreturn
2357 		  && is_gimple_call (stmt) && gimple_call_noreturn_p (stmt))
2358 		to_fixup.safe_push (stmt);
2359 	      /* Cleanup the CFG if we simplified a condition to
2360 	         true or false.  */
2361 	      if (gcond *cond = dyn_cast <gcond *> (stmt))
2362 		if (gimple_cond_true_p (cond)
2363 		    || gimple_cond_false_p (cond))
2364 		  cfg_changed = true;
2365 	      update_stmt (stmt);
2366 	    }
2367 
2368 	  switch (gimple_code (stmt))
2369 	    {
2370 	    case GIMPLE_ASSIGN:
2371 	      {
2372 		tree rhs1 = gimple_assign_rhs1 (stmt);
2373 		enum tree_code code = gimple_assign_rhs_code (stmt);
2374 
2375 		if (code == COND_EXPR
2376 		    || code == VEC_COND_EXPR)
2377 		  {
2378 		    /* In this case the entire COND_EXPR is in rhs1. */
2379 		    if (forward_propagate_into_cond (&gsi))
2380 		      {
2381 			changed = true;
2382 			stmt = gsi_stmt (gsi);
2383 		      }
2384 		  }
2385 		else if (TREE_CODE_CLASS (code) == tcc_comparison)
2386 		  {
2387 		    int did_something;
2388 		    did_something = forward_propagate_into_comparison (&gsi);
2389 		    if (did_something == 2)
2390 		      cfg_changed = true;
2391 		    changed = did_something != 0;
2392 		  }
2393 		else if ((code == PLUS_EXPR
2394 			  || code == BIT_IOR_EXPR
2395 			  || code == BIT_XOR_EXPR)
2396 			 && simplify_rotate (&gsi))
2397 		  changed = true;
2398 		else if (code == VEC_PERM_EXPR)
2399 		  {
2400 		    int did_something = simplify_permutation (&gsi);
2401 		    if (did_something == 2)
2402 		      cfg_changed = true;
2403 		    changed = did_something != 0;
2404 		  }
2405 		else if (code == BIT_FIELD_REF)
2406 		  changed = simplify_bitfield_ref (&gsi);
2407                 else if (code == CONSTRUCTOR
2408                          && TREE_CODE (TREE_TYPE (rhs1)) == VECTOR_TYPE)
2409                   changed = simplify_vector_constructor (&gsi);
2410 		break;
2411 	      }
2412 
2413 	    case GIMPLE_SWITCH:
2414 	      changed = simplify_gimple_switch (as_a <gswitch *> (stmt));
2415 	      break;
2416 
2417 	    case GIMPLE_COND:
2418 	      {
2419 		int did_something
2420 		  = forward_propagate_into_gimple_cond (as_a <gcond *> (stmt));
2421 		if (did_something == 2)
2422 		  cfg_changed = true;
2423 		changed = did_something != 0;
2424 		break;
2425 	      }
2426 
2427 	    case GIMPLE_CALL:
2428 	      {
2429 		tree callee = gimple_call_fndecl (stmt);
2430 		if (callee != NULL_TREE
2431 		    && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL)
2432 		  changed = simplify_builtin_call (&gsi, callee);
2433 		break;
2434 	      }
2435 
2436 	    default:;
2437 	    }
2438 
2439 	  if (changed)
2440 	    {
2441 	      /* If the stmt changed then re-visit it and the statements
2442 		 inserted before it.  */
2443 	      for (; !gsi_end_p (gsi); gsi_prev (&gsi))
2444 		if (gimple_plf (gsi_stmt (gsi), GF_PLF_1))
2445 		  break;
2446 	      if (gsi_end_p (gsi))
2447 		gsi = gsi_start_bb (bb);
2448 	      else
2449 		gsi_next (&gsi);
2450 	    }
2451 	  else
2452 	    {
2453 	      /* Stmt no longer needs to be revisited.  */
2454 	      gimple_set_plf (stmt, GF_PLF_1, true);
2455 
2456 	      /* Fill up the lattice.  */
2457 	      if (gimple_assign_single_p (stmt))
2458 		{
2459 		  tree lhs = gimple_assign_lhs (stmt);
2460 		  tree rhs = gimple_assign_rhs1 (stmt);
2461 		  if (TREE_CODE (lhs) == SSA_NAME)
2462 		    {
2463 		      tree val = lhs;
2464 		      if (TREE_CODE (rhs) == SSA_NAME)
2465 			val = fwprop_ssa_val (rhs);
2466 		      else if (is_gimple_min_invariant (rhs))
2467 			val = rhs;
2468 		      fwprop_set_lattice_val (lhs, val);
2469 		    }
2470 		}
2471 
2472 	      gsi_next (&gsi);
2473 	    }
2474 	}
2475     }
2476   free (postorder);
2477   lattice.release ();
2478 
2479   /* Fixup stmts that became noreturn calls.  This may require splitting
2480      blocks and thus isn't possible during the walk.  Do this
2481      in reverse order so we don't inadvertedly remove a stmt we want to
2482      fixup by visiting a dominating now noreturn call first.  */
2483   while (!to_fixup.is_empty ())
2484     {
2485       gimple stmt = to_fixup.pop ();
2486       if (dump_file && dump_flags & TDF_DETAILS)
2487 	{
2488 	  fprintf (dump_file, "Fixing up noreturn call ");
2489 	  print_gimple_stmt (dump_file, stmt, 0, 0);
2490 	  fprintf (dump_file, "\n");
2491 	}
2492       cfg_changed |= fixup_noreturn_call (stmt);
2493     }
2494 
2495   cfg_changed |= gimple_purge_all_dead_eh_edges (to_purge);
2496   BITMAP_FREE (to_purge);
2497 
2498   if (cfg_changed)
2499     todoflags |= TODO_cleanup_cfg;
2500 
2501   return todoflags;
2502 }
2503 
2504 } // anon namespace
2505 
2506 gimple_opt_pass *
2507 make_pass_forwprop (gcc::context *ctxt)
2508 {
2509   return new pass_forwprop (ctxt);
2510 }
2511