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