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