]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/tree-ssa-dse.c
rs6000: re-enable web and rnreg with -funroll-loops
[thirdparty/gcc.git] / gcc / tree-ssa-dse.c
1 /* Dead and redundant store elimination
2 Copyright (C) 2004-2019 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 "tree-pass.h"
28 #include "ssa.h"
29 #include "gimple-pretty-print.h"
30 #include "fold-const.h"
31 #include "gimple-iterator.h"
32 #include "tree-cfg.h"
33 #include "tree-dfa.h"
34 #include "domwalk.h"
35 #include "tree-cfgcleanup.h"
36 #include "alias.h"
37 #include "tree-ssa-loop.h"
38 #include "tree-ssa-dse.h"
39
40 /* This file implements dead store elimination.
41
42 A dead store is a store into a memory location which will later be
43 overwritten by another store without any intervening loads. In this
44 case the earlier store can be deleted or trimmed if the store
45 was partially dead.
46
47 A redundant store is a store into a memory location which stores
48 the exact same value as a prior store to the same memory location.
49 While this can often be handled by dead store elimination, removing
50 the redundant store is often better than removing or trimming the
51 dead store.
52
53 In our SSA + virtual operand world we use immediate uses of virtual
54 operands to detect these cases. If a store's virtual definition
55 is used precisely once by a later store to the same location which
56 post dominates the first store, then the first store is dead. If
57 the data stored is the same, then the second store is redundant.
58
59 The single use of the store's virtual definition ensures that
60 there are no intervening aliased loads and the requirement that
61 the second load post dominate the first ensures that if the earlier
62 store executes, then the later stores will execute before the function
63 exits.
64
65 It may help to think of this as first moving the earlier store to
66 the point immediately before the later store. Again, the single
67 use of the virtual definition and the post-dominance relationship
68 ensure that such movement would be safe. Clearly if there are
69 back to back stores, then the second is makes the first dead. If
70 the second store stores the same value, then the second store is
71 redundant.
72
73 Reviewing section 10.7.2 in Morgan's "Building an Optimizing Compiler"
74 may also help in understanding this code since it discusses the
75 relationship between dead store and redundant load elimination. In
76 fact, they are the same transformation applied to different views of
77 the CFG. */
78
79 static void delete_dead_or_redundant_call (gimple_stmt_iterator *, const char *);
80
81 /* Bitmap of blocks that have had EH statements cleaned. We should
82 remove their dead edges eventually. */
83 static bitmap need_eh_cleanup;
84
85 /* STMT is a statement that may write into memory. Analyze it and
86 initialize WRITE to describe how STMT affects memory.
87
88 Return TRUE if the the statement was analyzed, FALSE otherwise.
89
90 It is always safe to return FALSE. But typically better optimziation
91 can be achieved by analyzing more statements. */
92
93 static bool
94 initialize_ao_ref_for_dse (gimple *stmt, ao_ref *write)
95 {
96 /* It's advantageous to handle certain mem* functions. */
97 if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
98 {
99 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (stmt)))
100 {
101 case BUILT_IN_MEMCPY:
102 case BUILT_IN_MEMMOVE:
103 case BUILT_IN_MEMSET:
104 case BUILT_IN_MEMCPY_CHK:
105 case BUILT_IN_MEMMOVE_CHK:
106 case BUILT_IN_MEMSET_CHK:
107 case BUILT_IN_STRNCPY:
108 case BUILT_IN_STRNCPY_CHK:
109 {
110 tree size = gimple_call_arg (stmt, 2);
111 tree ptr = gimple_call_arg (stmt, 0);
112 ao_ref_init_from_ptr_and_size (write, ptr, size);
113 return true;
114 }
115
116 /* A calloc call can never be dead, but it can make
117 subsequent stores redundant if they store 0 into
118 the same memory locations. */
119 case BUILT_IN_CALLOC:
120 {
121 tree nelem = gimple_call_arg (stmt, 0);
122 tree selem = gimple_call_arg (stmt, 1);
123 tree lhs;
124 if (TREE_CODE (nelem) == INTEGER_CST
125 && TREE_CODE (selem) == INTEGER_CST
126 && (lhs = gimple_call_lhs (stmt)) != NULL_TREE)
127 {
128 tree size = fold_build2 (MULT_EXPR, TREE_TYPE (nelem),
129 nelem, selem);
130 ao_ref_init_from_ptr_and_size (write, lhs, size);
131 return true;
132 }
133 }
134
135 default:
136 break;
137 }
138 }
139 else if (is_gimple_assign (stmt))
140 {
141 ao_ref_init (write, gimple_assign_lhs (stmt));
142 return true;
143 }
144 return false;
145 }
146
147 /* Given REF from the the alias oracle, return TRUE if it is a valid
148 memory reference for dead store elimination, false otherwise.
149
150 In particular, the reference must have a known base, known maximum
151 size, start at a byte offset and have a size that is one or more
152 bytes. */
153
154 static bool
155 valid_ao_ref_for_dse (ao_ref *ref)
156 {
157 return (ao_ref_base (ref)
158 && known_size_p (ref->max_size)
159 && maybe_ne (ref->size, 0)
160 && known_eq (ref->max_size, ref->size)
161 && known_ge (ref->offset, 0)
162 && multiple_p (ref->offset, BITS_PER_UNIT)
163 && multiple_p (ref->size, BITS_PER_UNIT));
164 }
165
166 /* Try to normalize COPY (an ao_ref) relative to REF. Essentially when we are
167 done COPY will only refer bytes found within REF. Return true if COPY
168 is known to intersect at least one byte of REF. */
169
170 static bool
171 normalize_ref (ao_ref *copy, ao_ref *ref)
172 {
173 if (!ordered_p (copy->offset, ref->offset))
174 return false;
175
176 /* If COPY starts before REF, then reset the beginning of
177 COPY to match REF and decrease the size of COPY by the
178 number of bytes removed from COPY. */
179 if (maybe_lt (copy->offset, ref->offset))
180 {
181 poly_int64 diff = ref->offset - copy->offset;
182 if (maybe_le (copy->size, diff))
183 return false;
184 copy->size -= diff;
185 copy->offset = ref->offset;
186 }
187
188 poly_int64 diff = copy->offset - ref->offset;
189 if (maybe_le (ref->size, diff))
190 return false;
191
192 /* If COPY extends beyond REF, chop off its size appropriately. */
193 poly_int64 limit = ref->size - diff;
194 if (!ordered_p (limit, copy->size))
195 return false;
196
197 if (maybe_gt (copy->size, limit))
198 copy->size = limit;
199 return true;
200 }
201
202 /* Clear any bytes written by STMT from the bitmap LIVE_BYTES. The base
203 address written by STMT must match the one found in REF, which must
204 have its base address previously initialized.
205
206 This routine must be conservative. If we don't know the offset or
207 actual size written, assume nothing was written. */
208
209 static void
210 clear_bytes_written_by (sbitmap live_bytes, gimple *stmt, ao_ref *ref)
211 {
212 ao_ref write;
213 if (!initialize_ao_ref_for_dse (stmt, &write))
214 return;
215
216 /* Verify we have the same base memory address, the write
217 has a known size and overlaps with REF. */
218 HOST_WIDE_INT start, size;
219 if (valid_ao_ref_for_dse (&write)
220 && operand_equal_p (write.base, ref->base, OEP_ADDRESS_OF)
221 && known_eq (write.size, write.max_size)
222 && normalize_ref (&write, ref)
223 && (write.offset - ref->offset).is_constant (&start)
224 && write.size.is_constant (&size))
225 bitmap_clear_range (live_bytes, start / BITS_PER_UNIT,
226 size / BITS_PER_UNIT);
227 }
228
229 /* REF is a memory write. Extract relevant information from it and
230 initialize the LIVE_BYTES bitmap. If successful, return TRUE.
231 Otherwise return FALSE. */
232
233 static bool
234 setup_live_bytes_from_ref (ao_ref *ref, sbitmap live_bytes)
235 {
236 HOST_WIDE_INT const_size;
237 if (valid_ao_ref_for_dse (ref)
238 && ref->size.is_constant (&const_size)
239 && (const_size / BITS_PER_UNIT
240 <= param_dse_max_object_size))
241 {
242 bitmap_clear (live_bytes);
243 bitmap_set_range (live_bytes, 0, const_size / BITS_PER_UNIT);
244 return true;
245 }
246 return false;
247 }
248
249 /* Compute the number of elements that we can trim from the head and
250 tail of ORIG resulting in a bitmap that is a superset of LIVE.
251
252 Store the number of elements trimmed from the head and tail in
253 TRIM_HEAD and TRIM_TAIL.
254
255 STMT is the statement being trimmed and is used for debugging dump
256 output only. */
257
258 static void
259 compute_trims (ao_ref *ref, sbitmap live, int *trim_head, int *trim_tail,
260 gimple *stmt)
261 {
262 /* We use sbitmaps biased such that ref->offset is bit zero and the bitmap
263 extends through ref->size. So we know that in the original bitmap
264 bits 0..ref->size were true. We don't actually need the bitmap, just
265 the REF to compute the trims. */
266
267 /* Now identify how much, if any of the tail we can chop off. */
268 HOST_WIDE_INT const_size;
269 int last_live = bitmap_last_set_bit (live);
270 if (ref->size.is_constant (&const_size))
271 {
272 int last_orig = (const_size / BITS_PER_UNIT) - 1;
273 /* We can leave inconvenient amounts on the tail as
274 residual handling in mem* and str* functions is usually
275 reasonably efficient. */
276 *trim_tail = last_orig - last_live;
277
278 /* But don't trim away out of bounds accesses, as this defeats
279 proper warnings.
280
281 We could have a type with no TYPE_SIZE_UNIT or we could have a VLA
282 where TYPE_SIZE_UNIT is not a constant. */
283 if (*trim_tail
284 && TYPE_SIZE_UNIT (TREE_TYPE (ref->base))
285 && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (ref->base))) == INTEGER_CST
286 && compare_tree_int (TYPE_SIZE_UNIT (TREE_TYPE (ref->base)),
287 last_orig) <= 0)
288 *trim_tail = 0;
289 }
290 else
291 *trim_tail = 0;
292
293 /* Identify how much, if any of the head we can chop off. */
294 int first_orig = 0;
295 int first_live = bitmap_first_set_bit (live);
296 *trim_head = first_live - first_orig;
297
298 /* If more than a word remains, then make sure to keep the
299 starting point at least word aligned. */
300 if (last_live - first_live > UNITS_PER_WORD)
301 *trim_head &= ~(UNITS_PER_WORD - 1);
302
303 if ((*trim_head || *trim_tail)
304 && dump_file && (dump_flags & TDF_DETAILS))
305 {
306 fprintf (dump_file, " Trimming statement (head = %d, tail = %d): ",
307 *trim_head, *trim_tail);
308 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
309 fprintf (dump_file, "\n");
310 }
311 }
312
313 /* STMT initializes an object from COMPLEX_CST where one or more of the
314 bytes written may be dead stores. REF is a representation of the
315 memory written. LIVE is the bitmap of stores that are actually live.
316
317 Attempt to rewrite STMT so that only the real or imaginary part of
318 the object is actually stored. */
319
320 static void
321 maybe_trim_complex_store (ao_ref *ref, sbitmap live, gimple *stmt)
322 {
323 int trim_head, trim_tail;
324 compute_trims (ref, live, &trim_head, &trim_tail, stmt);
325
326 /* The amount of data trimmed from the head or tail must be at
327 least half the size of the object to ensure we're trimming
328 the entire real or imaginary half. By writing things this
329 way we avoid more O(n) bitmap operations. */
330 if (known_ge (trim_tail * 2 * BITS_PER_UNIT, ref->size))
331 {
332 /* TREE_REALPART is live */
333 tree x = TREE_REALPART (gimple_assign_rhs1 (stmt));
334 tree y = gimple_assign_lhs (stmt);
335 y = build1 (REALPART_EXPR, TREE_TYPE (x), y);
336 gimple_assign_set_lhs (stmt, y);
337 gimple_assign_set_rhs1 (stmt, x);
338 }
339 else if (known_ge (trim_head * 2 * BITS_PER_UNIT, ref->size))
340 {
341 /* TREE_IMAGPART is live */
342 tree x = TREE_IMAGPART (gimple_assign_rhs1 (stmt));
343 tree y = gimple_assign_lhs (stmt);
344 y = build1 (IMAGPART_EXPR, TREE_TYPE (x), y);
345 gimple_assign_set_lhs (stmt, y);
346 gimple_assign_set_rhs1 (stmt, x);
347 }
348
349 /* Other cases indicate parts of both the real and imag subobjects
350 are live. We do not try to optimize those cases. */
351 }
352
353 /* STMT initializes an object using a CONSTRUCTOR where one or more of the
354 bytes written are dead stores. ORIG is the bitmap of bytes stored by
355 STMT. LIVE is the bitmap of stores that are actually live.
356
357 Attempt to rewrite STMT so that only the real or imaginary part of
358 the object is actually stored.
359
360 The most common case for getting here is a CONSTRUCTOR with no elements
361 being used to zero initialize an object. We do not try to handle other
362 cases as those would force us to fully cover the object with the
363 CONSTRUCTOR node except for the components that are dead. */
364
365 static void
366 maybe_trim_constructor_store (ao_ref *ref, sbitmap live, gimple *stmt)
367 {
368 tree ctor = gimple_assign_rhs1 (stmt);
369
370 /* This is the only case we currently handle. It actually seems to
371 catch most cases of actual interest. */
372 gcc_assert (CONSTRUCTOR_NELTS (ctor) == 0);
373
374 int head_trim = 0;
375 int tail_trim = 0;
376 compute_trims (ref, live, &head_trim, &tail_trim, stmt);
377
378 /* Now we want to replace the constructor initializer
379 with memset (object + head_trim, 0, size - head_trim - tail_trim). */
380 if (head_trim || tail_trim)
381 {
382 /* We want &lhs for the MEM_REF expression. */
383 tree lhs_addr = build_fold_addr_expr (gimple_assign_lhs (stmt));
384
385 if (! is_gimple_min_invariant (lhs_addr))
386 return;
387
388 /* The number of bytes for the new constructor. */
389 poly_int64 ref_bytes = exact_div (ref->size, BITS_PER_UNIT);
390 poly_int64 count = ref_bytes - head_trim - tail_trim;
391
392 /* And the new type for the CONSTRUCTOR. Essentially it's just
393 a char array large enough to cover the non-trimmed parts of
394 the original CONSTRUCTOR. Note we want explicit bounds here
395 so that we know how many bytes to clear when expanding the
396 CONSTRUCTOR. */
397 tree type = build_array_type_nelts (char_type_node, count);
398
399 /* Build a suitable alias type rather than using alias set zero
400 to avoid pessimizing. */
401 tree alias_type = reference_alias_ptr_type (gimple_assign_lhs (stmt));
402
403 /* Build a MEM_REF representing the whole accessed area, starting
404 at the first byte not trimmed. */
405 tree exp = fold_build2 (MEM_REF, type, lhs_addr,
406 build_int_cst (alias_type, head_trim));
407
408 /* Now update STMT with a new RHS and LHS. */
409 gimple_assign_set_lhs (stmt, exp);
410 gimple_assign_set_rhs1 (stmt, build_constructor (type, NULL));
411 }
412 }
413
414 /* STMT is a memcpy, memmove or memset. Decrement the number of bytes
415 copied/set by DECREMENT. */
416 static void
417 decrement_count (gimple *stmt, int decrement)
418 {
419 tree *countp = gimple_call_arg_ptr (stmt, 2);
420 gcc_assert (TREE_CODE (*countp) == INTEGER_CST);
421 *countp = wide_int_to_tree (TREE_TYPE (*countp), (TREE_INT_CST_LOW (*countp)
422 - decrement));
423
424 }
425
426 static void
427 increment_start_addr (gimple *stmt, tree *where, int increment)
428 {
429 if (TREE_CODE (*where) == SSA_NAME)
430 {
431 tree tem = make_ssa_name (TREE_TYPE (*where));
432 gassign *newop
433 = gimple_build_assign (tem, POINTER_PLUS_EXPR, *where,
434 build_int_cst (sizetype, increment));
435 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
436 gsi_insert_before (&gsi, newop, GSI_SAME_STMT);
437 *where = tem;
438 update_stmt (gsi_stmt (gsi));
439 return;
440 }
441
442 *where = build_fold_addr_expr (fold_build2 (MEM_REF, char_type_node,
443 *where,
444 build_int_cst (ptr_type_node,
445 increment)));
446 }
447
448 /* STMT is builtin call that writes bytes in bitmap ORIG, some bytes are dead
449 (ORIG & ~NEW) and need not be stored. Try to rewrite STMT to reduce
450 the amount of data it actually writes.
451
452 Right now we only support trimming from the head or the tail of the
453 memory region. In theory we could split the mem* call, but it's
454 likely of marginal value. */
455
456 static void
457 maybe_trim_memstar_call (ao_ref *ref, sbitmap live, gimple *stmt)
458 {
459 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (stmt)))
460 {
461 case BUILT_IN_MEMCPY:
462 case BUILT_IN_MEMMOVE:
463 case BUILT_IN_STRNCPY:
464 case BUILT_IN_MEMCPY_CHK:
465 case BUILT_IN_MEMMOVE_CHK:
466 case BUILT_IN_STRNCPY_CHK:
467 {
468 int head_trim, tail_trim;
469 compute_trims (ref, live, &head_trim, &tail_trim, stmt);
470
471 /* Tail trimming is easy, we can just reduce the count. */
472 if (tail_trim)
473 decrement_count (stmt, tail_trim);
474
475 /* Head trimming requires adjusting all the arguments. */
476 if (head_trim)
477 {
478 tree *dst = gimple_call_arg_ptr (stmt, 0);
479 increment_start_addr (stmt, dst, head_trim);
480 tree *src = gimple_call_arg_ptr (stmt, 1);
481 increment_start_addr (stmt, src, head_trim);
482 decrement_count (stmt, head_trim);
483 }
484 break;
485 }
486
487 case BUILT_IN_MEMSET:
488 case BUILT_IN_MEMSET_CHK:
489 {
490 int head_trim, tail_trim;
491 compute_trims (ref, live, &head_trim, &tail_trim, stmt);
492
493 /* Tail trimming is easy, we can just reduce the count. */
494 if (tail_trim)
495 decrement_count (stmt, tail_trim);
496
497 /* Head trimming requires adjusting all the arguments. */
498 if (head_trim)
499 {
500 tree *dst = gimple_call_arg_ptr (stmt, 0);
501 increment_start_addr (stmt, dst, head_trim);
502 decrement_count (stmt, head_trim);
503 }
504 break;
505 }
506
507 default:
508 break;
509 }
510 }
511
512 /* STMT is a memory write where one or more bytes written are dead
513 stores. ORIG is the bitmap of bytes stored by STMT. LIVE is the
514 bitmap of stores that are actually live.
515
516 Attempt to rewrite STMT so that it writes fewer memory locations. Right
517 now we only support trimming at the start or end of the memory region.
518 It's not clear how much there is to be gained by trimming from the middle
519 of the region. */
520
521 static void
522 maybe_trim_partially_dead_store (ao_ref *ref, sbitmap live, gimple *stmt)
523 {
524 if (is_gimple_assign (stmt)
525 && TREE_CODE (gimple_assign_lhs (stmt)) != TARGET_MEM_REF)
526 {
527 switch (gimple_assign_rhs_code (stmt))
528 {
529 case CONSTRUCTOR:
530 maybe_trim_constructor_store (ref, live, stmt);
531 break;
532 case COMPLEX_CST:
533 maybe_trim_complex_store (ref, live, stmt);
534 break;
535 default:
536 break;
537 }
538 }
539 }
540
541 /* Return TRUE if USE_REF reads bytes from LIVE where live is
542 derived from REF, a write reference.
543
544 While this routine may modify USE_REF, it's passed by value, not
545 location. So callers do not see those modifications. */
546
547 static bool
548 live_bytes_read (ao_ref use_ref, ao_ref *ref, sbitmap live)
549 {
550 /* We have already verified that USE_REF and REF hit the same object.
551 Now verify that there's actually an overlap between USE_REF and REF. */
552 HOST_WIDE_INT start, size;
553 if (normalize_ref (&use_ref, ref)
554 && (use_ref.offset - ref->offset).is_constant (&start)
555 && use_ref.size.is_constant (&size))
556 {
557 /* If USE_REF covers all of REF, then it will hit one or more
558 live bytes. This avoids useless iteration over the bitmap
559 below. */
560 if (start == 0 && known_eq (size, ref->size))
561 return true;
562
563 /* Now check if any of the remaining bits in use_ref are set in LIVE. */
564 return bitmap_bit_in_range_p (live, start / BITS_PER_UNIT,
565 (start + size - 1) / BITS_PER_UNIT);
566 }
567 return true;
568 }
569
570 /* Callback for dse_classify_store calling for_each_index. Verify that
571 indices are invariant in the loop with backedge PHI in basic-block DATA. */
572
573 static bool
574 check_name (tree, tree *idx, void *data)
575 {
576 basic_block phi_bb = (basic_block) data;
577 if (TREE_CODE (*idx) == SSA_NAME
578 && !SSA_NAME_IS_DEFAULT_DEF (*idx)
579 && dominated_by_p (CDI_DOMINATORS, gimple_bb (SSA_NAME_DEF_STMT (*idx)),
580 phi_bb))
581 return false;
582 return true;
583 }
584
585 /* STMT stores the value 0 into one or more memory locations
586 (via memset, empty constructor, calloc call, etc).
587
588 See if there is a subsequent store of the value 0 to one
589 or more of the same memory location(s). If so, the subsequent
590 store is redundant and can be removed.
591
592 The subsequent stores could be via memset, empty constructors,
593 simple MEM stores, etc. */
594
595 static void
596 dse_optimize_redundant_stores (gimple *stmt)
597 {
598 int cnt = 0;
599
600 /* We could do something fairly complex and look through PHIs
601 like DSE_CLASSIFY_STORE, but it doesn't seem to be worth
602 the effort.
603
604 Look at all the immediate uses of the VDEF (which are obviously
605 dominated by STMT). See if one or more stores 0 into the same
606 memory locations a STMT, if so remove the immediate use statements. */
607 tree defvar = gimple_vdef (stmt);
608 imm_use_iterator ui;
609 gimple *use_stmt;
610 FOR_EACH_IMM_USE_STMT (use_stmt, ui, defvar)
611 {
612 /* Limit stmt walking. */
613 if (++cnt > param_dse_max_alias_queries_per_store)
614 BREAK_FROM_IMM_USE_STMT (ui);
615
616 /* If USE_STMT stores 0 into one or more of the same locations
617 as STMT and STMT would kill USE_STMT, then we can just remove
618 USE_STMT. */
619 tree fndecl;
620 if ((is_gimple_assign (use_stmt)
621 && gimple_vdef (use_stmt)
622 && (gimple_assign_single_p (use_stmt)
623 && initializer_zerop (gimple_assign_rhs1 (use_stmt))))
624 || (gimple_call_builtin_p (use_stmt, BUILT_IN_NORMAL)
625 && (fndecl = gimple_call_fndecl (use_stmt)) != NULL
626 && (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMSET
627 || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMSET_CHK)
628 && integer_zerop (gimple_call_arg (use_stmt, 1))))
629 {
630 ao_ref write;
631
632 if (!initialize_ao_ref_for_dse (use_stmt, &write))
633 BREAK_FROM_IMM_USE_STMT (ui)
634
635 if (valid_ao_ref_for_dse (&write)
636 && stmt_kills_ref_p (stmt, &write))
637 {
638 gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt);
639 if (is_gimple_assign (use_stmt))
640 delete_dead_or_redundant_assignment (&gsi, "redundant",
641 need_eh_cleanup);
642 else if (is_gimple_call (use_stmt))
643 delete_dead_or_redundant_call (&gsi, "redundant");
644 else
645 gcc_unreachable ();
646 }
647 }
648 }
649 }
650
651 /* A helper of dse_optimize_stmt.
652 Given a GIMPLE_ASSIGN in STMT that writes to REF, classify it
653 according to downstream uses and defs. Sets *BY_CLOBBER_P to true
654 if only clobber statements influenced the classification result.
655 Returns the classification. */
656
657 dse_store_status
658 dse_classify_store (ao_ref *ref, gimple *stmt,
659 bool byte_tracking_enabled, sbitmap live_bytes,
660 bool *by_clobber_p, tree stop_at_vuse)
661 {
662 gimple *temp;
663 int cnt = 0;
664 auto_bitmap visited;
665
666 if (by_clobber_p)
667 *by_clobber_p = true;
668
669 /* Find the first dominated statement that clobbers (part of) the
670 memory stmt stores to with no intermediate statement that may use
671 part of the memory stmt stores. That is, find a store that may
672 prove stmt to be a dead store. */
673 temp = stmt;
674 do
675 {
676 gimple *use_stmt;
677 imm_use_iterator ui;
678 bool fail = false;
679 tree defvar;
680
681 if (gimple_code (temp) == GIMPLE_PHI)
682 {
683 /* If we visit this PHI by following a backedge then we have to
684 make sure ref->ref only refers to SSA names that are invariant
685 with respect to the loop represented by this PHI node. */
686 if (dominated_by_p (CDI_DOMINATORS, gimple_bb (stmt),
687 gimple_bb (temp))
688 && !for_each_index (ref->ref ? &ref->ref : &ref->base,
689 check_name, gimple_bb (temp)))
690 return DSE_STORE_LIVE;
691 defvar = PHI_RESULT (temp);
692 bitmap_set_bit (visited, SSA_NAME_VERSION (defvar));
693 }
694 else
695 defvar = gimple_vdef (temp);
696
697 /* If we're instructed to stop walking at region boundary, do so. */
698 if (defvar == stop_at_vuse)
699 return DSE_STORE_LIVE;
700
701 auto_vec<gimple *, 10> defs;
702 gimple *phi_def = NULL;
703 FOR_EACH_IMM_USE_STMT (use_stmt, ui, defvar)
704 {
705 /* Limit stmt walking. */
706 if (++cnt > param_dse_max_alias_queries_per_store)
707 {
708 fail = true;
709 BREAK_FROM_IMM_USE_STMT (ui);
710 }
711
712 /* We have visited ourselves already so ignore STMT for the
713 purpose of chaining. */
714 if (use_stmt == stmt)
715 ;
716 /* In simple cases we can look through PHI nodes, but we
717 have to be careful with loops and with memory references
718 containing operands that are also operands of PHI nodes.
719 See gcc.c-torture/execute/20051110-*.c. */
720 else if (gimple_code (use_stmt) == GIMPLE_PHI)
721 {
722 /* If we already visited this PHI ignore it for further
723 processing. */
724 if (!bitmap_bit_p (visited,
725 SSA_NAME_VERSION (PHI_RESULT (use_stmt))))
726 {
727 defs.safe_push (use_stmt);
728 phi_def = use_stmt;
729 }
730 }
731 /* If the statement is a use the store is not dead. */
732 else if (ref_maybe_used_by_stmt_p (use_stmt, ref))
733 {
734 /* Handle common cases where we can easily build an ao_ref
735 structure for USE_STMT and in doing so we find that the
736 references hit non-live bytes and thus can be ignored. */
737 if (byte_tracking_enabled
738 && is_gimple_assign (use_stmt))
739 {
740 ao_ref use_ref;
741 ao_ref_init (&use_ref, gimple_assign_rhs1 (use_stmt));
742 if (valid_ao_ref_for_dse (&use_ref)
743 && use_ref.base == ref->base
744 && known_eq (use_ref.size, use_ref.max_size)
745 && !live_bytes_read (use_ref, ref, live_bytes))
746 {
747 /* If this is a store, remember it as we possibly
748 need to walk the defs uses. */
749 if (gimple_vdef (use_stmt))
750 defs.safe_push (use_stmt);
751 continue;
752 }
753 }
754
755 fail = true;
756 BREAK_FROM_IMM_USE_STMT (ui);
757 }
758 /* If this is a store, remember it as we possibly need to walk the
759 defs uses. */
760 else if (gimple_vdef (use_stmt))
761 defs.safe_push (use_stmt);
762 }
763
764 if (fail)
765 {
766 /* STMT might be partially dead and we may be able to reduce
767 how many memory locations it stores into. */
768 if (byte_tracking_enabled && !gimple_clobber_p (stmt))
769 return DSE_STORE_MAYBE_PARTIAL_DEAD;
770 return DSE_STORE_LIVE;
771 }
772
773 /* If we didn't find any definition this means the store is dead
774 if it isn't a store to global reachable memory. In this case
775 just pretend the stmt makes itself dead. Otherwise fail. */
776 if (defs.is_empty ())
777 {
778 if (ref_may_alias_global_p (ref))
779 return DSE_STORE_LIVE;
780
781 if (by_clobber_p)
782 *by_clobber_p = false;
783 return DSE_STORE_DEAD;
784 }
785
786 /* Process defs and remove those we need not process further. */
787 for (unsigned i = 0; i < defs.length ();)
788 {
789 gimple *def = defs[i];
790 gimple *use_stmt;
791 use_operand_p use_p;
792 /* If the path to check starts with a kill we do not need to
793 process it further.
794 ??? With byte tracking we need only kill the bytes currently
795 live. */
796 if (stmt_kills_ref_p (def, ref))
797 {
798 if (by_clobber_p && !gimple_clobber_p (def))
799 *by_clobber_p = false;
800 defs.unordered_remove (i);
801 }
802 /* In addition to kills we can remove defs whose only use
803 is another def in defs. That can only ever be PHIs of which
804 we track a single for simplicity reasons (we fail for multiple
805 PHIs anyways). We can also ignore defs that feed only into
806 already visited PHIs. */
807 else if (gimple_code (def) != GIMPLE_PHI
808 && single_imm_use (gimple_vdef (def), &use_p, &use_stmt)
809 && (use_stmt == phi_def
810 || (gimple_code (use_stmt) == GIMPLE_PHI
811 && bitmap_bit_p (visited,
812 SSA_NAME_VERSION
813 (PHI_RESULT (use_stmt))))))
814 defs.unordered_remove (i);
815 else
816 ++i;
817 }
818
819 /* If all defs kill the ref we are done. */
820 if (defs.is_empty ())
821 return DSE_STORE_DEAD;
822 /* If more than one def survives fail. */
823 if (defs.length () > 1)
824 {
825 /* STMT might be partially dead and we may be able to reduce
826 how many memory locations it stores into. */
827 if (byte_tracking_enabled && !gimple_clobber_p (stmt))
828 return DSE_STORE_MAYBE_PARTIAL_DEAD;
829 return DSE_STORE_LIVE;
830 }
831 temp = defs[0];
832
833 /* Track partial kills. */
834 if (byte_tracking_enabled)
835 {
836 clear_bytes_written_by (live_bytes, temp, ref);
837 if (bitmap_empty_p (live_bytes))
838 {
839 if (by_clobber_p && !gimple_clobber_p (temp))
840 *by_clobber_p = false;
841 return DSE_STORE_DEAD;
842 }
843 }
844 }
845 /* Continue walking until there are no more live bytes. */
846 while (1);
847 }
848
849
850 class dse_dom_walker : public dom_walker
851 {
852 public:
853 dse_dom_walker (cdi_direction direction)
854 : dom_walker (direction),
855 m_live_bytes (param_dse_max_object_size),
856 m_byte_tracking_enabled (false) {}
857
858 virtual edge before_dom_children (basic_block);
859
860 private:
861 auto_sbitmap m_live_bytes;
862 bool m_byte_tracking_enabled;
863 void dse_optimize_stmt (gimple_stmt_iterator *);
864 };
865
866 /* Delete a dead call at GSI, which is mem* call of some kind. */
867 static void
868 delete_dead_or_redundant_call (gimple_stmt_iterator *gsi, const char *type)
869 {
870 gimple *stmt = gsi_stmt (*gsi);
871 if (dump_file && (dump_flags & TDF_DETAILS))
872 {
873 fprintf (dump_file, " Deleted %s call: ", type);
874 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
875 fprintf (dump_file, "\n");
876 }
877
878 tree lhs = gimple_call_lhs (stmt);
879 if (lhs)
880 {
881 tree ptr = gimple_call_arg (stmt, 0);
882 gimple *new_stmt = gimple_build_assign (lhs, ptr);
883 unlink_stmt_vdef (stmt);
884 if (gsi_replace (gsi, new_stmt, true))
885 bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
886 }
887 else
888 {
889 /* Then we need to fix the operand of the consuming stmt. */
890 unlink_stmt_vdef (stmt);
891
892 /* Remove the dead store. */
893 if (gsi_remove (gsi, true))
894 bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
895 release_defs (stmt);
896 }
897 }
898
899 /* Delete a dead store at GSI, which is a gimple assignment. */
900
901 void
902 delete_dead_or_redundant_assignment (gimple_stmt_iterator *gsi, const char *type,
903 bitmap need_eh_cleanup)
904 {
905 gimple *stmt = gsi_stmt (*gsi);
906 if (dump_file && (dump_flags & TDF_DETAILS))
907 {
908 fprintf (dump_file, " Deleted %s store: ", type);
909 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
910 fprintf (dump_file, "\n");
911 }
912
913 /* Then we need to fix the operand of the consuming stmt. */
914 unlink_stmt_vdef (stmt);
915
916 /* Remove the dead store. */
917 basic_block bb = gimple_bb (stmt);
918 if (gsi_remove (gsi, true) && need_eh_cleanup)
919 bitmap_set_bit (need_eh_cleanup, bb->index);
920
921 /* And release any SSA_NAMEs set in this statement back to the
922 SSA_NAME manager. */
923 release_defs (stmt);
924 }
925
926 /* Attempt to eliminate dead stores in the statement referenced by BSI.
927
928 A dead store is a store into a memory location which will later be
929 overwritten by another store without any intervening loads. In this
930 case the earlier store can be deleted.
931
932 In our SSA + virtual operand world we use immediate uses of virtual
933 operands to detect dead stores. If a store's virtual definition
934 is used precisely once by a later store to the same location which
935 post dominates the first store, then the first store is dead. */
936
937 void
938 dse_dom_walker::dse_optimize_stmt (gimple_stmt_iterator *gsi)
939 {
940 gimple *stmt = gsi_stmt (*gsi);
941
942 /* If this statement has no virtual defs, then there is nothing
943 to do. */
944 if (!gimple_vdef (stmt))
945 return;
946
947 /* Don't return early on *this_2(D) ={v} {CLOBBER}. */
948 if (gimple_has_volatile_ops (stmt)
949 && (!gimple_clobber_p (stmt)
950 || TREE_CODE (gimple_assign_lhs (stmt)) != MEM_REF))
951 return;
952
953 ao_ref ref;
954 if (!initialize_ao_ref_for_dse (stmt, &ref))
955 return;
956
957 /* We know we have virtual definitions. We can handle assignments and
958 some builtin calls. */
959 if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
960 {
961 tree fndecl = gimple_call_fndecl (stmt);
962 switch (DECL_FUNCTION_CODE (fndecl))
963 {
964 case BUILT_IN_MEMCPY:
965 case BUILT_IN_MEMMOVE:
966 case BUILT_IN_STRNCPY:
967 case BUILT_IN_MEMSET:
968 case BUILT_IN_MEMCPY_CHK:
969 case BUILT_IN_MEMMOVE_CHK:
970 case BUILT_IN_STRNCPY_CHK:
971 case BUILT_IN_MEMSET_CHK:
972 {
973 /* Occasionally calls with an explicit length of zero
974 show up in the IL. It's pointless to do analysis
975 on them, they're trivially dead. */
976 tree size = gimple_call_arg (stmt, 2);
977 if (integer_zerop (size))
978 {
979 delete_dead_or_redundant_call (gsi, "dead");
980 return;
981 }
982
983 /* If this is a memset call that initializes an object
984 to zero, it may be redundant with an earlier memset
985 or empty CONSTRUCTOR of a larger object. */
986 if ((DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMSET
987 || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMSET_CHK)
988 && integer_zerop (gimple_call_arg (stmt, 1)))
989 dse_optimize_redundant_stores (stmt);
990
991 enum dse_store_status store_status;
992 m_byte_tracking_enabled
993 = setup_live_bytes_from_ref (&ref, m_live_bytes);
994 store_status = dse_classify_store (&ref, stmt,
995 m_byte_tracking_enabled,
996 m_live_bytes);
997 if (store_status == DSE_STORE_LIVE)
998 return;
999
1000 if (store_status == DSE_STORE_MAYBE_PARTIAL_DEAD)
1001 {
1002 maybe_trim_memstar_call (&ref, m_live_bytes, stmt);
1003 return;
1004 }
1005
1006 if (store_status == DSE_STORE_DEAD)
1007 delete_dead_or_redundant_call (gsi, "dead");
1008 return;
1009 }
1010
1011 case BUILT_IN_CALLOC:
1012 /* We already know the arguments are integer constants. */
1013 dse_optimize_redundant_stores (stmt);
1014 return;
1015
1016 default:
1017 return;
1018 }
1019 }
1020
1021 if (is_gimple_assign (stmt))
1022 {
1023 bool by_clobber_p = false;
1024
1025 /* Check if this statement stores zero to a memory location,
1026 and if there is a subsequent store of zero to the same
1027 memory location. If so, remove the subsequent store. */
1028 if (gimple_assign_single_p (stmt)
1029 && initializer_zerop (gimple_assign_rhs1 (stmt)))
1030 dse_optimize_redundant_stores (stmt);
1031
1032 /* Self-assignments are zombies. */
1033 if (operand_equal_p (gimple_assign_rhs1 (stmt),
1034 gimple_assign_lhs (stmt), 0))
1035 ;
1036 else
1037 {
1038 m_byte_tracking_enabled
1039 = setup_live_bytes_from_ref (&ref, m_live_bytes);
1040 enum dse_store_status store_status;
1041 store_status = dse_classify_store (&ref, stmt,
1042 m_byte_tracking_enabled,
1043 m_live_bytes, &by_clobber_p);
1044 if (store_status == DSE_STORE_LIVE)
1045 return;
1046
1047 if (store_status == DSE_STORE_MAYBE_PARTIAL_DEAD)
1048 {
1049 maybe_trim_partially_dead_store (&ref, m_live_bytes, stmt);
1050 return;
1051 }
1052 }
1053
1054 /* Now we know that use_stmt kills the LHS of stmt. */
1055
1056 /* But only remove *this_2(D) ={v} {CLOBBER} if killed by
1057 another clobber stmt. */
1058 if (gimple_clobber_p (stmt)
1059 && !by_clobber_p)
1060 return;
1061
1062 delete_dead_or_redundant_assignment (gsi, "dead", need_eh_cleanup);
1063 }
1064 }
1065
1066 edge
1067 dse_dom_walker::before_dom_children (basic_block bb)
1068 {
1069 gimple_stmt_iterator gsi;
1070
1071 for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi);)
1072 {
1073 dse_optimize_stmt (&gsi);
1074 if (gsi_end_p (gsi))
1075 gsi = gsi_last_bb (bb);
1076 else
1077 gsi_prev (&gsi);
1078 }
1079 return NULL;
1080 }
1081
1082 namespace {
1083
1084 const pass_data pass_data_dse =
1085 {
1086 GIMPLE_PASS, /* type */
1087 "dse", /* name */
1088 OPTGROUP_NONE, /* optinfo_flags */
1089 TV_TREE_DSE, /* tv_id */
1090 ( PROP_cfg | PROP_ssa ), /* properties_required */
1091 0, /* properties_provided */
1092 0, /* properties_destroyed */
1093 0, /* todo_flags_start */
1094 0, /* todo_flags_finish */
1095 };
1096
1097 class pass_dse : public gimple_opt_pass
1098 {
1099 public:
1100 pass_dse (gcc::context *ctxt)
1101 : gimple_opt_pass (pass_data_dse, ctxt)
1102 {}
1103
1104 /* opt_pass methods: */
1105 opt_pass * clone () { return new pass_dse (m_ctxt); }
1106 virtual bool gate (function *) { return flag_tree_dse != 0; }
1107 virtual unsigned int execute (function *);
1108
1109 }; // class pass_dse
1110
1111 unsigned int
1112 pass_dse::execute (function *fun)
1113 {
1114 need_eh_cleanup = BITMAP_ALLOC (NULL);
1115
1116 renumber_gimple_stmt_uids (cfun);
1117
1118 /* We might consider making this a property of each pass so that it
1119 can be [re]computed on an as-needed basis. Particularly since
1120 this pass could be seen as an extension of DCE which needs post
1121 dominators. */
1122 calculate_dominance_info (CDI_POST_DOMINATORS);
1123 calculate_dominance_info (CDI_DOMINATORS);
1124
1125 /* Dead store elimination is fundamentally a walk of the post-dominator
1126 tree and a backwards walk of statements within each block. */
1127 dse_dom_walker (CDI_POST_DOMINATORS).walk (fun->cfg->x_exit_block_ptr);
1128
1129 /* Removal of stores may make some EH edges dead. Purge such edges from
1130 the CFG as needed. */
1131 if (!bitmap_empty_p (need_eh_cleanup))
1132 {
1133 gimple_purge_all_dead_eh_edges (need_eh_cleanup);
1134 cleanup_tree_cfg ();
1135 }
1136
1137 BITMAP_FREE (need_eh_cleanup);
1138
1139 /* For now, just wipe the post-dominator information. */
1140 free_dominance_info (CDI_POST_DOMINATORS);
1141 return 0;
1142 }
1143
1144 } // anon namespace
1145
1146 gimple_opt_pass *
1147 make_pass_dse (gcc::context *ctxt)
1148 {
1149 return new pass_dse (ctxt);
1150 }