1 /* Dead and redundant store elimination
2 Copyright (C) 2004-2020 Free Software Foundation, Inc.
4 This file is part of GCC.
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)
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.
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/>. */
22 #include "coretypes.h"
27 #include "tree-pass.h"
29 #include "gimple-pretty-print.h"
30 #include "fold-const.h"
31 #include "gimple-iterator.h"
35 #include "tree-cfgcleanup.h"
37 #include "tree-ssa-loop.h"
38 #include "tree-ssa-dse.h"
40 /* This file implements dead store elimination.
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
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
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.
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
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
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
79 static void delete_dead_or_redundant_call (gimple_stmt_iterator
*, const char *);
81 /* Bitmap of blocks that have had EH statements cleaned. We should
82 remove their dead edges eventually. */
83 static bitmap need_eh_cleanup
;
85 /* STMT is a statement that may write into memory. Analyze it and
86 initialize WRITE to describe how STMT affects memory.
88 Return TRUE if the the statement was analyzed, FALSE otherwise.
90 It is always safe to return FALSE. But typically better optimziation
91 can be achieved by analyzing more statements. */
94 initialize_ao_ref_for_dse (gimple
*stmt
, ao_ref
*write
)
96 /* It's advantageous to handle certain mem* functions. */
97 if (gimple_call_builtin_p (stmt
, BUILT_IN_NORMAL
))
99 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (stmt
)))
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
:
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
);
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
:
121 tree nelem
= gimple_call_arg (stmt
, 0);
122 tree selem
= gimple_call_arg (stmt
, 1);
124 if (TREE_CODE (nelem
) == INTEGER_CST
125 && TREE_CODE (selem
) == INTEGER_CST
126 && (lhs
= gimple_call_lhs (stmt
)) != NULL_TREE
)
128 tree size
= fold_build2 (MULT_EXPR
, TREE_TYPE (nelem
),
130 ao_ref_init_from_ptr_and_size (write
, lhs
, size
);
139 else if (is_gimple_assign (stmt
))
141 ao_ref_init (write
, gimple_assign_lhs (stmt
));
147 /* Given REF from the the alias oracle, return TRUE if it is a valid
148 memory reference for dead store elimination, false otherwise.
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
155 valid_ao_ref_for_dse (ao_ref
*ref
)
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
));
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. */
171 normalize_ref (ao_ref
*copy
, ao_ref
*ref
)
173 if (!ordered_p (copy
->offset
, ref
->offset
))
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
))
181 poly_int64 diff
= ref
->offset
- copy
->offset
;
182 if (maybe_le (copy
->size
, diff
))
185 copy
->offset
= ref
->offset
;
188 poly_int64 diff
= copy
->offset
- ref
->offset
;
189 if (maybe_le (ref
->size
, diff
))
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
))
197 if (maybe_gt (copy
->size
, limit
))
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.
206 This routine must be conservative. If we don't know the offset or
207 actual size written, assume nothing was written. */
210 clear_bytes_written_by (sbitmap live_bytes
, gimple
*stmt
, ao_ref
*ref
)
213 if (!initialize_ao_ref_for_dse (stmt
, &write
))
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
);
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. */
234 setup_live_bytes_from_ref (ao_ref
*ref
, sbitmap live_bytes
)
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
))
242 bitmap_clear (live_bytes
);
243 bitmap_set_range (live_bytes
, 0, const_size
/ BITS_PER_UNIT
);
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.
252 Store the number of elements trimmed from the head and tail in
253 TRIM_HEAD and TRIM_TAIL.
255 STMT is the statement being trimmed and is used for debugging dump
259 compute_trims (ao_ref
*ref
, sbitmap live
, int *trim_head
, int *trim_tail
,
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. */
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
))
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
;
278 /* But don't trim away out of bounds accesses, as this defeats
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. */
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
)),
293 /* Identify how much, if any of the head we can chop off. */
295 int first_live
= bitmap_first_set_bit (live
);
296 *trim_head
= first_live
- first_orig
;
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);
303 if ((*trim_head
|| *trim_tail
)
304 && dump_file
&& (dump_flags
& TDF_DETAILS
))
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");
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.
317 Attempt to rewrite STMT so that only the real or imaginary part of
318 the object is actually stored. */
321 maybe_trim_complex_store (ao_ref
*ref
, sbitmap live
, gimple
*stmt
)
323 int trim_head
, trim_tail
;
324 compute_trims (ref
, live
, &trim_head
, &trim_tail
, stmt
);
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
))
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
);
339 else if (known_ge (trim_head
* 2 * BITS_PER_UNIT
, ref
->size
))
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
);
349 /* Other cases indicate parts of both the real and imag subobjects
350 are live. We do not try to optimize those cases. */
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.
357 Attempt to rewrite STMT so that only the real or imaginary part of
358 the object is actually stored.
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. */
366 maybe_trim_constructor_store (ao_ref
*ref
, sbitmap live
, gimple
*stmt
)
368 tree ctor
= gimple_assign_rhs1 (stmt
);
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);
376 compute_trims (ref
, live
, &head_trim
, &tail_trim
, stmt
);
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
)
382 /* We want &lhs for the MEM_REF expression. */
383 tree lhs_addr
= build_fold_addr_expr (gimple_assign_lhs (stmt
));
385 if (! is_gimple_min_invariant (lhs_addr
))
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
;
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
397 tree type
= build_array_type_nelts (char_type_node
, count
);
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
));
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
));
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
));
414 /* STMT is a memcpy, memmove or memset. Decrement the number of bytes
415 copied/set by DECREMENT. */
417 decrement_count (gimple
*stmt
, int decrement
)
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
)
427 increment_start_addr (gimple
*stmt
, tree
*where
, int increment
)
429 if (TREE_CODE (*where
) == SSA_NAME
)
431 tree tem
= make_ssa_name (TREE_TYPE (*where
));
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
);
438 update_stmt (gsi_stmt (gsi
));
442 *where
= build_fold_addr_expr (fold_build2 (MEM_REF
, char_type_node
,
444 build_int_cst (ptr_type_node
,
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.
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. */
457 maybe_trim_memstar_call (ao_ref
*ref
, sbitmap live
, gimple
*stmt
)
459 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (stmt
)))
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
:
468 int head_trim
, tail_trim
;
469 compute_trims (ref
, live
, &head_trim
, &tail_trim
, stmt
);
471 /* Tail trimming is easy, we can just reduce the count. */
473 decrement_count (stmt
, tail_trim
);
475 /* Head trimming requires adjusting all the arguments. */
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
);
487 case BUILT_IN_MEMSET
:
488 case BUILT_IN_MEMSET_CHK
:
490 int head_trim
, tail_trim
;
491 compute_trims (ref
, live
, &head_trim
, &tail_trim
, stmt
);
493 /* Tail trimming is easy, we can just reduce the count. */
495 decrement_count (stmt
, tail_trim
);
497 /* Head trimming requires adjusting all the arguments. */
500 tree
*dst
= gimple_call_arg_ptr (stmt
, 0);
501 increment_start_addr (stmt
, dst
, head_trim
);
502 decrement_count (stmt
, head_trim
);
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.
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
522 maybe_trim_partially_dead_store (ao_ref
*ref
, sbitmap live
, gimple
*stmt
)
524 if (is_gimple_assign (stmt
)
525 && TREE_CODE (gimple_assign_lhs (stmt
)) != TARGET_MEM_REF
)
527 switch (gimple_assign_rhs_code (stmt
))
530 maybe_trim_constructor_store (ref
, live
, stmt
);
533 maybe_trim_complex_store (ref
, live
, stmt
);
541 /* Return TRUE if USE_REF reads bytes from LIVE where live is
542 derived from REF, a write reference.
544 While this routine may modify USE_REF, it's passed by value, not
545 location. So callers do not see those modifications. */
548 live_bytes_read (ao_ref use_ref
, ao_ref
*ref
, sbitmap live
)
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
))
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
560 if (start
== 0 && known_eq (size
, ref
->size
))
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
);
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. */
574 check_name (tree
, tree
*idx
, void *data
)
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
)),
585 /* STMT stores the value 0 into one or more memory locations
586 (via memset, empty constructor, calloc call, etc).
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.
592 The subsequent stores could be via memset, empty constructors,
593 simple MEM stores, etc. */
596 dse_optimize_redundant_stores (gimple
*stmt
)
600 /* We could do something fairly complex and look through PHIs
601 like DSE_CLASSIFY_STORE, but it doesn't seem to be worth
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
);
610 FOR_EACH_IMM_USE_STMT (use_stmt
, ui
, defvar
)
612 /* Limit stmt walking. */
613 if (++cnt
> param_dse_max_alias_queries_per_store
)
614 BREAK_FROM_IMM_USE_STMT (ui
);
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
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))))
632 if (!initialize_ao_ref_for_dse (use_stmt
, &write
))
633 BREAK_FROM_IMM_USE_STMT (ui
)
635 if (valid_ao_ref_for_dse (&write
)
636 && stmt_kills_ref_p (stmt
, &write
))
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",
642 else if (is_gimple_call (use_stmt
))
643 delete_dead_or_redundant_call (&gsi
, "redundant");
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. */
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
)
667 *by_clobber_p
= true;
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. */
681 if (gimple_code (temp
) == GIMPLE_PHI
)
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
),
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
));
695 defvar
= gimple_vdef (temp
);
697 /* If we're instructed to stop walking at region boundary, do so. */
698 if (defvar
== stop_at_vuse
)
699 return DSE_STORE_LIVE
;
701 auto_vec
<gimple
*, 10> defs
;
702 gimple
*phi_def
= NULL
;
703 FOR_EACH_IMM_USE_STMT (use_stmt
, ui
, defvar
)
705 /* Limit stmt walking. */
706 if (++cnt
> param_dse_max_alias_queries_per_store
)
709 BREAK_FROM_IMM_USE_STMT (ui
);
712 /* We have visited ourselves already so ignore STMT for the
713 purpose of chaining. */
714 if (use_stmt
== stmt
)
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
)
722 /* If we already visited this PHI ignore it for further
724 if (!bitmap_bit_p (visited
,
725 SSA_NAME_VERSION (PHI_RESULT (use_stmt
))))
727 defs
.safe_push (use_stmt
);
731 /* If the statement is a use the store is not dead. */
732 else if (ref_maybe_used_by_stmt_p (use_stmt
, ref
))
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
))
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
))
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
);
756 BREAK_FROM_IMM_USE_STMT (ui
);
758 /* If this is a store, remember it as we possibly need to walk the
760 else if (gimple_vdef (use_stmt
))
761 defs
.safe_push (use_stmt
);
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
;
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 ())
778 if (ref_may_alias_global_p (ref
))
779 return DSE_STORE_LIVE
;
782 *by_clobber_p
= false;
783 return DSE_STORE_DEAD
;
786 /* Process defs and remove those we need not process further. */
787 for (unsigned i
= 0; i
< defs
.length ();)
789 gimple
*def
= defs
[i
];
792 /* If the path to check starts with a kill we do not need to
794 ??? With byte tracking we need only kill the bytes currently
796 if (stmt_kills_ref_p (def
, ref
))
798 if (by_clobber_p
&& !gimple_clobber_p (def
))
799 *by_clobber_p
= false;
800 defs
.unordered_remove (i
);
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
,
813 (PHI_RESULT (use_stmt
))))))
814 defs
.unordered_remove (i
);
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)
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
;
833 /* Track partial kills. */
834 if (byte_tracking_enabled
)
836 clear_bytes_written_by (live_bytes
, temp
, ref
);
837 if (bitmap_empty_p (live_bytes
))
839 if (by_clobber_p
&& !gimple_clobber_p (temp
))
840 *by_clobber_p
= false;
841 return DSE_STORE_DEAD
;
845 /* Continue walking until there are no more live bytes. */
850 class dse_dom_walker
: public dom_walker
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) {}
858 virtual edge
before_dom_children (basic_block
);
861 auto_sbitmap m_live_bytes
;
862 bool m_byte_tracking_enabled
;
863 void dse_optimize_stmt (gimple_stmt_iterator
*);
866 /* Delete a dead call at GSI, which is mem* call of some kind. */
868 delete_dead_or_redundant_call (gimple_stmt_iterator
*gsi
, const char *type
)
870 gimple
*stmt
= gsi_stmt (*gsi
);
871 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
873 fprintf (dump_file
, " Deleted %s call: ", type
);
874 print_gimple_stmt (dump_file
, stmt
, 0, dump_flags
);
875 fprintf (dump_file
, "\n");
878 tree lhs
= gimple_call_lhs (stmt
);
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
);
889 /* Then we need to fix the operand of the consuming stmt. */
890 unlink_stmt_vdef (stmt
);
892 /* Remove the dead store. */
893 if (gsi_remove (gsi
, true))
894 bitmap_set_bit (need_eh_cleanup
, gimple_bb (stmt
)->index
);
899 /* Delete a dead store at GSI, which is a gimple assignment. */
902 delete_dead_or_redundant_assignment (gimple_stmt_iterator
*gsi
, const char *type
,
903 bitmap need_eh_cleanup
)
905 gimple
*stmt
= gsi_stmt (*gsi
);
906 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
908 fprintf (dump_file
, " Deleted %s store: ", type
);
909 print_gimple_stmt (dump_file
, stmt
, 0, dump_flags
);
910 fprintf (dump_file
, "\n");
913 /* Then we need to fix the operand of the consuming stmt. */
914 unlink_stmt_vdef (stmt
);
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
);
921 /* And release any SSA_NAMEs set in this statement back to the
926 /* Attempt to eliminate dead stores in the statement referenced by BSI.
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.
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. */
938 dse_dom_walker::dse_optimize_stmt (gimple_stmt_iterator
*gsi
)
940 gimple
*stmt
= gsi_stmt (*gsi
);
942 /* If this statement has no virtual defs, then there is nothing
944 if (!gimple_vdef (stmt
))
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
))
954 if (!initialize_ao_ref_for_dse (stmt
, &ref
))
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
))
961 tree fndecl
= gimple_call_fndecl (stmt
);
962 switch (DECL_FUNCTION_CODE (fndecl
))
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
:
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
))
979 delete_dead_or_redundant_call (gsi
, "dead");
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
);
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
,
997 if (store_status
== DSE_STORE_LIVE
)
1000 if (store_status
== DSE_STORE_MAYBE_PARTIAL_DEAD
)
1002 maybe_trim_memstar_call (&ref
, m_live_bytes
, stmt
);
1006 if (store_status
== DSE_STORE_DEAD
)
1007 delete_dead_or_redundant_call (gsi
, "dead");
1011 case BUILT_IN_CALLOC
:
1012 /* We already know the arguments are integer constants. */
1013 dse_optimize_redundant_stores (stmt
);
1021 if (is_gimple_assign (stmt
))
1023 bool by_clobber_p
= false;
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
);
1032 /* Self-assignments are zombies. */
1033 if (operand_equal_p (gimple_assign_rhs1 (stmt
),
1034 gimple_assign_lhs (stmt
), 0))
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
)
1047 if (store_status
== DSE_STORE_MAYBE_PARTIAL_DEAD
)
1049 maybe_trim_partially_dead_store (&ref
, m_live_bytes
, stmt
);
1054 /* Now we know that use_stmt kills the LHS of stmt. */
1056 /* But only remove *this_2(D) ={v} {CLOBBER} if killed by
1057 another clobber stmt. */
1058 if (gimple_clobber_p (stmt
)
1062 delete_dead_or_redundant_assignment (gsi
, "dead", need_eh_cleanup
);
1067 dse_dom_walker::before_dom_children (basic_block bb
)
1069 gimple_stmt_iterator gsi
;
1071 for (gsi
= gsi_last_bb (bb
); !gsi_end_p (gsi
);)
1073 dse_optimize_stmt (&gsi
);
1074 if (gsi_end_p (gsi
))
1075 gsi
= gsi_last_bb (bb
);
1084 const pass_data pass_data_dse
=
1086 GIMPLE_PASS
, /* type */
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 */
1097 class pass_dse
: public gimple_opt_pass
1100 pass_dse (gcc::context
*ctxt
)
1101 : gimple_opt_pass (pass_data_dse
, ctxt
)
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
*);
1109 }; // class pass_dse
1112 pass_dse::execute (function
*fun
)
1114 need_eh_cleanup
= BITMAP_ALLOC (NULL
);
1116 renumber_gimple_stmt_uids (cfun
);
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
1122 calculate_dominance_info (CDI_POST_DOMINATORS
);
1123 calculate_dominance_info (CDI_DOMINATORS
);
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
);
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
))
1133 gimple_purge_all_dead_eh_edges (need_eh_cleanup
);
1134 cleanup_tree_cfg ();
1137 BITMAP_FREE (need_eh_cleanup
);
1139 /* For now, just wipe the post-dominator information. */
1140 free_dominance_info (CDI_POST_DOMINATORS
);
1147 make_pass_dse (gcc::context
*ctxt
)
1149 return new pass_dse (ctxt
);